ASP.NET MVC使用Castle Windsor IoC

Mad*_*ing 2 castle-windsor inversion-of-control

我有一个应用程序,模仿Apress Pro ASP.NET MVC中的一个应用程序,使用城堡windsor的IoC来实例化各自的存储库控制器,这工作正常

例如

public class ItemController : Controller
{
    private IItemsRepository itemsRepository;
    public ItemController(IItemsRepository windsorItemsRepository)
    {
        this.itemsRepository = windsorItemsRepository;
    }
Run Code Online (Sandbox Code Playgroud)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.Core.Resource;
using System.Reflection;
using Castle.Core;

namespace WebUI
{
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        WindsorContainer container;

        // The constructor:
        // 1. Sets up a new IoC container
        // 2. Registers all components specified in web.config
        // 3. Registers all controller types as components
        public WindsorControllerFactory()
        {
            // Instantiate a container, taking configuration from web.config
            container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

            // Also register all the controller types as transient
            var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                  where typeof(IController).IsAssignableFrom(t)
                                  select t;
            foreach (Type t in controllerTypes)
                container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient);
        }

        // Constructs the controller instance needed to service each request
        protected override IController GetControllerInstance(Type controllerType)
        {
            return (IController)container.Resolve(controllerType);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制控制器创建.

我有时需要在控制器中创建其他存储库实例,从其他地方获取数据,我可以使用CW IoC执行此操作,如果是,那么如何?

我一直在玩新控制器类的创建,因为它们应该使用我现有的代码自动注册(如果我可以使用它,我可以在以后正确注册它们)但是当我尝试实例化它们时有一个明显的反对意见因为我无法为构造函数提供一个repos类(我很确定无论如何都是错误的方法).

任何帮助(特别是例子)将不胜感激.干杯MH

Mau*_*fer 5

只需在控制器构造函数中声明所需的依赖项,即:

public class MyController: Controller {
  private readonly IItemsRepository itemsRepo;
  private readonly IPersonRepository personRepo;
  public MyController(IItemsRepository i, IPersonRepository p) {
    itemsRepo = i;
    personRepo = p;
  }
}
Run Code Online (Sandbox Code Playgroud)

Windsor将在实例化控制器时自动解析依赖关系.

Google代码上有很多可以用作指导的项目,例如WineCellarManager.

BTW:你不需要编写自己的WindsorControllerFactory代码,你可以从MVCContrib获得(以及更多)