Как подключить контроллер зависимости - PullRequest
0 голосов
/ 17 сентября 2011

Итак, я прошел учебник asp.net по MVC для Castle Windsor, и мои регистрации выглядят так:

    private static IWindsorContainer _container = new WindsorContainer();
    private static void BootstrapContainer()
    {
        _container = new WindsorContainer()
            .Install(FromAssembly.This());
        var controllerFactory = new WindsorControllerFactory(_container.Kernel);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    }
    protected void Application_End()
    {
        _container.Dispose();
    }

Так что в моем HomeController у меня есть это:

public class HomeController : Controller
{
    private IUserService _userService;

    public HomeController(IUserService userService)
    {
        this._userService = userService;
    }
}

Как мне подключить этот контроллер к настройке IUserService?

Обновление На случай, если мне нужно что-то связать, мои проекты против сети:

web, interfaces, entities, data (nhibernate), services

1 Ответ

2 голосов
/ 17 сентября 2011

Реализация WindsorControllerFactory должна выглядеть следующим образом из документа http://docs.castleproject.org/Windsor.Windsor-tutorial-part-two-plugging-Windsor-in.ashx?HL=ikernel.

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
   private readonly IKernel kernel; 

   public WindsorControllerFactory(IKernel kernel) 
   { 
       this.kernel = kernel; 
   } 

   public override void ReleaseController(IController controller) 
   { 
       kernel.ReleaseComponent(controller); 
   } 

   protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
   { 
       if (controllerType == null) 
       { 
           // Throw exception. Can't resolve null type.
       }

       return (IController)kernel.Resolve(controllerType);
   } 
}

ОБНОВЛЕНО

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

Это можно сделать, вызвав метод .Register для контейнера.

container.Register(Component.For<IUserService>().ImplementedBy<UserService>().LifeStyle.Transient);

Подробнее здесь: http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx

...