代码之家  ›  专栏  ›  技术社区  ›  djdd87

从控制器实例化IRepository类的正确方法是什么?

  •  3
  • djdd87  · 技术社区  · 14 年前

    我有以下项目布局:

    MVC UI
    |...CustomerController (ICustomerRepository - how do I instantiate this?)
    
    Data Model
    |...ICustomerRepository
    
    DAL (Separate Data access layer, references Data Model to get the IxRepositories)
    |...CustomerRepository (inherits ICustomerRepository)
    

    正确的说法是什么 ICustomerRepository repository = new CustomerRepository(); 当控制器对DAL项目没有可见性时?还是我做的完全错了?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Russ Cam    14 年前

    您可以使用一个ioc容器来为您解析映射,方法是注册您自己的控制器工厂,该工厂允许容器解析控制器-容器将解析控制器类型并注入接口的具体实例。

    使用示例 Castle Windsor

    在global.asax中 MvcApplication 班级:

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
    }
    

    WindsorControllerFactory

    using System;
    using System.Linq;
    using System.Reflection;
    using System.Web.Mvc;
    using System.Web.Routing;
    using Castle.Core.Resource;
    using Castle.Windsor;
    using Castle.Windsor.Configuration.Interpreters;
    
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        WindsorContainer container;
    
        public WindsorControllerFactory()
        {
            container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
    
            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, Castle.Core.LifestyleType.Transient);
        }
    
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            // see http://stackoverflow.com/questions/1357485/asp-net-mvc2-preview-1-are-there-any-breaking-changes/1601706#1601706
            if (controllerType == null) { return null; }
    
            return (IController)container.Resolve(controllerType);
        }
    }