繁体   English   中英

unity [dependency]注入和Inheritance

[英]Unity [dependency] injection and Inheritance

我的问题如下:我有一个名为 ApplicationController 的基础 controller(ASP.Net MVC 控制器),我希望我所有的 controller 都继承自它。 这个基础 controller 有一个 ILogger 属性,标有 [Dependency] 属性。 (是的,我知道我应该使用构造函数注入,我只是对这个属性感到好奇)。

我创建了容器,注册了类型,更改了默认工厂,一切都很好。 问题是,当我尝试在派生的 controller 中使用我的 Logger 属性时,它没有得到解决。

我究竟做错了什么? 为什么容器在创建派生 controller 时不解析基础 class 依赖项?

代码示例:


应用控制器:

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

}

派生 controller:

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();
    }
}

Unity controller 工厂:

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;
    }
}

Global.asax.cs 示例:

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

        RegisterRoutes(RouteTable.Routes);
    }

我对 Unity 很陌生,所以也许我做错了什么。

谢谢,阿米。

AFAIK,Unity 只会解析公共属性。 因此,您的受保护财产将不会得到解决。

我不确定这是否相关,但通常情况下,我会避免使用同名的名称空间和类(在您的情况下为 Logger.Logger),因为我过去曾遇到过这个问题。 但这可能不是问题所在。

我也不确定 [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();
    }
}

和 rest 一样。 代码看起来没问题。

我对 unity 也不太熟悉,但我认为你需要用 contsaner 注册你的 HomeController,而不是记录器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM