Использование IoC для разрешения объектов модели в методах действия - PullRequest
1 голос
/ 30 декабря 2011

Я использую контейнер IoC для внедрения зависимостей в Asp.Net MVC 3, и все кажется идеальным, пока я не начал писать методы Action в моем контроллере.Каков наилучший способ создания объектов сущности / модели в методах действия?Иногда модели извлекаются из определенного репозитория или службы, которые вводятся в контроллер через конструктор, но это не относится ко многим другим объектам модели в системе.

Ответы [ 2 ]

3 голосов
/ 30 декабря 2011

Контейнер IOC лучше всего использовать для создания компонентов;но это не должно использоваться для создания объектов модели.Например, это good :

public ActionResult SignUp(string username, string password)
{
    var user = new User();    // Your model object
    user.Username = username; //...

    _repository.Save(user);

    return Redirect(...); 
}

Объект модели сам по себе не должен принимать никаких зависимостей, поэтому его не нужно разрешать из контейнера IOC.То же самое относится к моделям представлений:

public ActionResult Show(int userId)
{
    var user = _repository.Load<User>(userId);

    var model = new ShowUserModel(user);
    return View(model);
}

После создания модель модель / представление должна быть фактически доступна только для чтения, поэтому любая необходимая информация должна передаваться через контроллер - она ​​не должна принимать введенные зависимости.,

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

class HomeController : Controller
{
     readonly Func<IFooService> _fooServiceFactory;

     public HomeController(Func<IFooService> fooServiceFactory)
     {
         _fooServiceFactory = fooServiceFactory;
     }

     public ActionResult SomeAction() 
     {
         var service = _fooServiceFactory(); // Resolves IFooService dynamically
         service.DoStuff();
     }
}

Любой приличный контейнер IOC должен уметь обрабатывать Func<T> инъекцию,

3 голосов
/ 30 декабря 2011

Вы не используете контейнер DI для разрешения аргументов действия.Это то, что связыватель модели предназначен для ASP.NET MVC.И, кстати, ваши действия должны принимать любые доменные модели в качестве аргументов => они должны принимать только модели представления.Модели представлений - это классы, которые специально определены для удовлетворения требований данного представления.

Таким образом, для некоторых конкретных случаев у вас есть возможность написать пользовательский механизм связывания моделей, который будет отвечать за создание и привязку вашего действия.аргументы.Что касается создания экземпляра самого механизма связывания, в ASP.NET MVC 3 вы можете использовать средство разрешения зависимостей , которое можно использовать для внедрения зависимостей в это устройство связывания моделей с использованием выбранной вами структуры DI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...