C# 统一[依赖]注入和继承

C# 统一[依赖]注入和继承,c#,inheritance,dependency-injection,unity-container,C#,Inheritance,Dependency Injection,Unity Container,我的问题如下: 我有一个名为ApplicationController的基本控制器(ASP.Net MVC controller),我希望我的所有控制器都从中继承。此基本控制器具有ILogger属性,该属性用[Dependency]属性标记。(是的,我知道我应该使用构造函数注入,我只是好奇这个属性) 我创建了容器,注册了类型,更改了默认工厂,一切都很好。问题是,当我尝试在派生控制器中使用Logger属性时,它没有得到解决 我做错了什么?为什么容器在创建派生控制器时不解析基类依赖关系 代码示例:

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

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

我做错了什么?为什么容器在创建派生控制器时不解析基类依赖关系

代码示例:


应用程序控制器:

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 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;
    }
}
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);
    }
受保护的无效应用程序\u Start()
{
_容器=新的UnityContainer();
_container.RegisterType();
UnityController工厂=新的UnityController工厂(\u容器);
ControllerBuilder.Current.SetControllerFactory(工厂);
注册地址(RouteTable.Routes);
}

我对Unity很陌生,所以可能我做错了什么

谢谢,
Ami。

我不确定这是否相关,但通常,我避免使用同名的名称空间和类(在您的示例中为Logger.Logger),因为我过去在这方面遇到过问题。但这可能不是问题所在

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

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


    public ApplicationController(ILogger logger)
    {
         this._logger = logger;

    }
}


其余的都一样。代码看起来还可以。

我对unity也没有太多经验,但我认为您需要向contsaner注册HomeController,而不是向logger注册。

好的,unity只会解析公共属性。因此,您的受保护属性将无法解决。

我也遇到了同样的问题,并通过将ILogger更改为public来修复它。这是VS2010.NET4中的ASP.NETMVC2项目。从逻辑上讲,这是有意义的,因为Unity并没有创建代理类或任何东西,它只是设置它有权访问的属性,并有一个映射-因此只有公共属性。

这对application controller有效吗?你有过这样的功能吗?我的代码几乎相同,我也无法让基本控制器解析。有人吗?雷,在把房子公之于众后,它起了作用。这是让Unity工作所必须付出的代价。注册记录器是正确的,因为您希望注入依赖项(ILogger实现)。好的,Jakob得到2分:)将属性更改为public解决了问题。Unity容器解决了依赖关系,一切都很好。