Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Unity 2.1-从非泛型接口解析泛型类型?_Generics_Interface_Unity Container - Fatal编程技术网

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

Generics Unity 2.1-从非泛型接口解析泛型类型?,generics,interface,unity-container,Generics,Interface,Unity Container,我正在使用Unity(通过配置文件强制进入配置),现在我有点被卡住了。问题比较长,您可以跳到场景,问题和问题,配置/代码仅供参考 非常感谢您的帮助 配置: <register type="IService" mapTo="DefaultService" name="Context1" /> <register type="IService" mapTo="ExtendedService" name="Context2" /> <register type="IMa

我正在使用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
    }
}
内部上下文2:

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

  • Manager
    属性更改为方法,并像这样调用:
    .Manager()
  • IManager
    泛型类型添加到类中,并以某种方式在Unity resolve method中注入该类型,即使解析接口不是泛型的
  • 问题: 关于1:为什么不能在属性上指定泛型类型


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

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

    目前,您正在滥用容器作为一个容器


    更新


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

    但这意味着我必须配置构造函数值,这是不可能的。我正在使用一个特殊的
    ContextBasedName()
    方法,它在运行时提供一个名称……将容器解析机制用作工厂有什么问题?@Ropstah您看过我答案中包含的链接了吗?
    //Will return DefaultService
    var service = Container.Resolve<IService>(ContextBasedName());
    
    service.DoSomething(); //Will eventually call DefaultManager.DoSomething();
    
    //Will return ExtendedService
    var service = Container.Resolve<IService>(ContextBasedName()); 
    
    service.DoSomething(); //Will eventually call ExtendedManager.DoSomething();
    
    protected IManager Manager { 
        return Container.Resolve<IManager>(ContextBasedName());
    }