Nigrimmist
@Nigrimmist
Asp.net senior developer

Asp.net mvc3 -> Autofac вопрос?

Добрый день, хабражители.



Подскажите мне пожалуйста как я могу проделать следующее:



Есть класс UserManager, в нём конструктор, который принимает некий интерфейс (например ItblUsersRepository). Как я могу каждый раз вызывая UserManager резолвить этот интерфейс кроме как задания DependencyResolver.Current.GetService в конструкоре по умолчанию? Можно ли указанный код ниже как-то автоматизировать или задать из global.asax? Приложение asp.net mvc3 если это имеет значение.



Сейчас это выглядит как-то так:



public class UserManager <br>
    {<br>
        private ItblUsersRepository _userRepo;<br><br><br>
        public UserManager()<br>
        {<br><br>
            _userRepo = DependencyResolver.Current.GetService<ItblUsersRepository>();<br>
        }<br><br><br>
        public UserManager(ItblUsersRepository userRepo)<br>
        {<br>
            _userRepo = userRepo;<br>
        }<br>
}<br>
  • Вопрос задан
  • 3480 просмотров
Пригласить эксперта
Ответы на вопрос 1
если я правильно понял вопрос, то можно это сделать через фабрику контроллеров

Global.asax.cs:
protected void Application_Start()
{
    // ...

    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}


NinjectControllerFactory.cs:
public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel _ninjectKernel;

        public NinjectControllerFactory()
        {
            _ninjectKernel = new StandardKernel();
            AddBindings();
        }

        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            return controllerType == null
                       ? null
                       : (IController)_ninjectKernel.Get(controllerType);
        }

        private void AddBindings()
        {
            _ninjectKernel.Bind<ISomeInterface>().To<SomeClass>();            
        }
    }


Controller:
public class MyController : Controller
{
        public MyController(ISomeInterface inter)
        {
            _inter = inter;
        }
        
        // ...
}


Пример взят из книжки Pro ASP NET MVC 3 Framework авторства Adam Freeman и Steven Sanderson
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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