Как организовать решение MVC ASP.NET (DDD)

Я пытаюсь запустить новый проект (asp.net MVC), и я хотел бы применить некоторые правила DDD, которые я изучил за эти последние несколько месяцев.
Я не знаю, как организовать мое решение все же.
Я хотел бы использовать Nhibernate, но я не хочу использовать Быструю причину Nhibernate, это должно быть что-то как эксперимент.
Я видел некоторые примеры, где люди сохраняют все в том же проекте. Некоторые другие склонны создавать другой проект для всего. Вы думаете, что я должен дифференцировать модель и репозиторий или поместить его в тот же проект?
Если бы у кого-то есть некоторые ссылки на статьи и т.д., это ценилось бы.

спасибо

Alberto

5
задан anthares 9 March 2010 в 18:45
поделиться

4 ответа

Я лично считаю, что лучше разделить каждый слой на отдельный проект. Есть определенные вещи, которых вы не можете достичь, имея один большой проект ASP.NET MVC, включающий все ваши слои.

Например, предположим, что у вас есть классы Product и ProductFactory . Вы хотите принудительно создать объект Product , который будет выполняться через ProductFactory . Для этого можно сделать конструктор продукта класс внутренним . Таким образом, класс ProductFactory может создать экземпляр класса Product , поскольку Product и ProductFactory находятся в одной сборке. Однако, если вы попытаетесь создать экземпляр класса Product из другого проекта (то есть вашего проекта ASP.NET MVC), вы получите ошибку времени компиляции. Таким образом можно добиться лучшей инкапсуляции.

Обратите внимание, что если Продукт , ProductFactory и ваш Контроллер находятся в одном проекте, вы все равно можете увидеть Продукт ) конструктор в вашем Контроллере . Итак, разработчик-любитель, который не понимает архитектурных решений, лежащих в основе вашего дизайна, может просто проигнорировать ProductFactory и напрямую создать объект Product .

Кроме того, наличие отдельного проекта для каждого уровня упрощает обслуживание, поскольку вам приходится иметь дело с небольшими проектами, а не с одним большим проектом.

4
ответ дан 13 December 2019 в 19:26
поделиться

Джимми Богард (автор Automapper) написал отличную статью о том, как он структурирует свой код, что может помочь в принятии решения.

Я работал над проектами с тоннами отдельных сборок и проектов, которые имеют небольшое количество. Мое личное предпочтение состоит в том, чтобы иметь меньше собраний, так как мне всегда легче работать. Если вы используете хорошие принципы кодирования (например, ТЕЛО), то это не имеет значения, если вы используете 2 или 20 сборок.

-121--4746256-

Используйте серию Тейлора и попробуйте найти связь между членами серии, чтобы не вычислять вещи снова и снова

Вот пример косинуса:

double cosinus(double x, double prec)
{
    double t, s ;
    int p;
    p = 0;
    s = 1.0;
    t = 1.0;
    while(fabs(t/s) > prec)
    {
        p++;
        t = (-t * x * x) / ((2 * p - 1) * (2 * p));
        s += t;
    }
    return s;
}

с помощью этого мы можем получить новый термин суммы с помощью уже использованного (мы избегаем факториала и x 2p )

explanation

-121--590606-

Это зависит от того, насколько велик ваш проект, но я бы пошел на различные проекты для модели и репозитория. На мой взгляд, не подходит хранить вещи вашей модели в папке моделей проекта WEB Mvc. Там становится слишком многолюдно:)

В DDD важно не внедрять в логику домена элементы, специфичные для технологии (например, NHibernate или другие ORM). Это обычно с созданием так называемого антикоррупционного слоя.

В дополнение к образцу репозитория рекомендуется использовать образец спецификации для фильтрации данных, поступающих из репозитория.

2
ответ дан 13 December 2019 в 19:26
поделиться

В MVC2 есть концепция областей, которые создают разделение задач. Мне все еще не нравится, как это реализовано. Я создаю отдельный проект практически для каждого контроллера. Таким образом, я могу смешивать и сочетать контроллеры в новых проектах, над которыми я работаю. Отличный пример - у меня есть проект под названием "Security", который занимается всеми вопросами входа и управления пользователями. Другой мой проект называется "Notification", в котором обрабатываются все сообщения и электронная почта. Чтобы объединить их вместе, я создаю основной проект для того проекта, над которым работаю, а затем импортирую в него dll из другого проекта, и все, что мне нужно сделать, это обеспечить наличие представлений и javascript, и все будет работать.

0
ответ дан 13 December 2019 в 19:26
поделиться

Может быть, немного яснее. GC.SuppressFinalize (this) влияет только на объект, на который ссылается этот указатель, но не на какие-либо члены объекта. Это означает, что функция SupergreFinalize не применяется рекурсивно к членам объекта. Когда сборщик мусора восстанавливает память для объекта Disposed, вероятно, не будет активных ссылок на поля объектов. Так как GC.SuppressFinalize не был вызван во всех полях объекта, тогда сборщик мусора вызовет метод finalize для этих объектов, если они существуют. Когда он делает это полностью до времени выполнения и в целом вы должны просто позволить ему сделать свое дело.

-121--2786204-

Очевидно, что у меня есть ответ...; -)

Ответ - нет. Только объекты в декларации использования расположены

[Test]
public void TestUsing()
{
    bool innerDisposed = false;
    using (var conn = new SqlConnection())
    {
        var conn2 = new SqlConnection();
        conn2.Disposed += (sender, e) => { innerDisposed = true; };
    }

    Assert.False(innerDisposed); // not disposed
}

[Test]
public void TestUsing2()
{
    bool innerDisposed = false;
    using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
    {
        conn2.Disposed += (sender, e) => { innerDisposed = true; };
    }
    Assert.True(innerDisposed); // disposed, of course
}
-121--3064144-

Джимми Богард (автор Automapper) написал превосходную статью о том, как он строит свой код, что может помочь в вашем решении.

Я работал над проектами с тоннами отдельных сборок и проектов, которые имеют небольшое количество. Мое личное предпочтение состоит в том, чтобы иметь меньше собраний, так как мне всегда легче работать. Если вы используете хорошие принципы кодирования (например, ТЕЛО), то это не имеет значения, если вы используете 2 или 20 сборок.

5
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: