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

Unity[依赖]注入和继承

  •  10
  • Ami  · 技术社区  · 16 年前

    我的问题如下:


    public class ApplicationController : Controller
    {
        [Dependency]
        protected ILogger _logger { get; set; }
    
    }
    

    public class HomeController : ApplicationController
    {
        public HomeController()
        {
    
        }
        public ActionResult Index()
        {
            _logger.Log("Home controller constructor started.");
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
    
            return View();
        }
    
        public ActionResult About()
        {
            return View();
        }
    }
    

    public class UnityControllerFactory : DefaultControllerFactory
    {
        private readonly IUnityContainer _container;
        public UnityControllerFactory(IUnityContainer container)
        {
            _container = container;
        }
    
        protected override IController GetControllerInstance(Type controllerType)
        {
            return _container.Resolve(controllerType) as IController;
        }
    }
    

    protected void Application_Start()
        {
            _container = new UnityContainer();
            _container.RegisterType<ILogger, Logger.Logger>();
            UnityControllerFactory factory = new UnityControllerFactory(_container);
            ControllerBuilder.Current.SetControllerFactory(factory);
    
            RegisterRoutes(RouteTable.Routes);
        }
    

    谢谢, 阿米。

    4 回复  |  直到 16 年前
        1
  •  21
  •   Jakob Christensen    16 年前

    AFAIK,Unity只会解决公共财产。因此,您的受保护财产将无法解决。

        2
  •  0
  •   Samuel Carrijo    16 年前

    我也不确定[Dependency]属性是否适用于派生类型。如果你将其更改为构造函数注入,这仍然不起作用吗?类似于:

    public class ApplicationController : Controller
    {
        protected ILogger _logger { get; set; }
    
    
        public ApplicationController(ILogger logger)
        {
             this._logger = logger;
    
        }
    }
    

    public class HomeController : ApplicationController
    {
        public HomeController(ILogger logger) : base(logger)
        {
    
        }
        public ActionResult Index()
        {
            _logger.Log("Home controller constructor started.");
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
    
            return View();
        }
    
        public ActionResult About()
        {
            return View();
        }
    }
    

    其余的都一样。代码看起来不错。

        3
  •  0
  •   Adam Barney    16 年前

    我对unity也相当缺乏经验,但我认为你需要在控制器而不是记录器上注册你的HomeController。

        4
  •  0
  •   Douglas R    16 年前

    我也遇到了同样的问题,并通过将ILogger更改为public来修复它。这是一个ASP。NET MVC2项目。网4。从逻辑上讲,这是有道理的,因为Unity没有创建代理类或任何东西,它只是设置它可以访问的属性,并且有一个映射——因此只有公共属性。