Unity 2.1 - 从非泛型接口解析泛型类型?

时间:2012-03-28 12:45:40

标签: generics interface unity-container

我正在使用Unity(通过配置文件强制配置),我现在有点卡住了。问题相当长,你可以跳到场景,问题和问题,配置/代码可供参考。

非常感谢帮助!

配置

<register type="IService" mapTo="DefaultService" name="Context1" />
<register type="IService" mapTo="ExtendedService" name="Context2" />

<register type="IManager" mapTo="DefaultManager" name="Context1" />
<register type="IManager" mapTo="ExtendedManager" name="Context1" />

代码

public interface IService 
{
    void DoSomething();
}

public class DefaultService : IService 
{
    protected IManager Manager { 
        return Container.Resolve<IManager>(ContextBasedName());
    }

    public void DoSomething() {
        Manager.DoSomething();
    }
}

public class ExtendedService : DefaultService 
{

}

public interface IManager  
{
    void DoSomething();
}

public class DefaultManager : IManager 
{
    protected virtual void DoSomething() 
    {
        //Do something default
    }
}

public class ExtendedManager : DefaultManager
{
    protected override void DoSomething() 
    {
        //First do something special

        base.DoSomething(); //then the default
    }
}

方案

我有两个上下文,其中解析了基于IService的类型( Context1 Context2 )。 ContextBasedName()将返回实际上下文的正确字符串。

内部 Context1

//Will return DefaultService
var service = Container.Resolve<IService>(ContextBasedName());

service.DoSomething(); //Will eventually call DefaultManager.DoSomething();

内部 Context2

//Will return ExtendedService
var service = Container.Resolve<IService>(ContextBasedName()); 

service.DoSomething(); //Will eventually call ExtendedManager.DoSomething();

问题:

上述情况很好,但问题与上面的代码无法编译有关。由于Manager类中的DefaultService属性定义:

,它无法编译
protected IManager Manager { 
    return Container.Resolve<IManager>(ContextBasedName());
}

IManager泛型类型未在类级别定义。据我所知,只有两种解决方案:

  1. Manager属性更改为方法,并按以下方式调用:.Manager<IManager>()
  2. 在类中添加IManager泛型类型,以某种方式在Unity解析方法中注入类型,即使解析接口不是通用的
  3. 问题:

    关于1:为什么不能在属性上指定泛型类型?

    关于2:是否可以在解析方法或配置中指定具体类型,即使该接口不是通用的?

1 个答案:

答案 0 :(得分:1)

为什么不使用构造函数注入并为每个服务配置正确的管理器注入?

目前,您正在将容器滥用为service locator


<强>更新

如果需要提供运行时值,请为管理器而不是管理器实例注入工厂。