Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
C# 如何使用Unity Dependency注入Web API实现策略/外观模式_C#_Asp.net Mvc_Design Patterns_Dependency Injection_Unity Container - Fatal编程技术网

C# 如何使用Unity Dependency注入Web API实现策略/外观模式

C# 如何使用Unity Dependency注入Web API实现策略/外观模式,c#,asp.net-mvc,design-patterns,dependency-injection,unity-container,C#,Asp.net Mvc,Design Patterns,Dependency Injection,Unity Container,如何告诉Unity.WebApi依赖注入框架,在正确的控制器中注入正确的类 DI项目容器 public class UnityContainerConfig { private static IUnityContainer _unityContainer = null; public static IUnityContainer Initialize() { if (_unityContainer == null) {

如何告诉Unity.WebApi依赖注入框架,在正确的控制器中注入正确的类

DI项目容器

public class UnityContainerConfig
{

    private static IUnityContainer _unityContainer = null;

    public static IUnityContainer Initialize()
    {
        if (_unityContainer == null)
        {
            _unityContainer = new Microsoft.Practices.Unity.UnityContainer()  
            .RegisterType<IMyInterface, MyClass1>("MyClass1")
            .RegisterType<IMyInterface, MyClass2>("MyClass2")
     }
}
控制器1:

 private IMyInterface _myInterface
 ///MyClass1
 public XController(
         IMyInterface myInterface
        )
    {
        _myInterface = myInterface
    }
控制器2:

 private IMyInterface _myInterface
 ///MyClass2
 public YController(
         IMyInterface myInterface
        )
    {
        _myInterface = myInterface
    }

与使用策略或门面解决此问题相比,更好的解决方案是重新设计每个控制器的唯一接口。一旦有了唯一的接口类型,DI容器将自动向每个控制器注入正确的服务

选择1 使用通用接口

public interface IMyInterface<T>
{
}

public class XController
{
    private readonly IMyInterface<XClass> myInterface;

    public XController(IMyInterface<XClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

public class YController
{
    private readonly IMyInterface<YClass> myInterface;

    public YController(IMyInterface<YClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

与使用策略或门面解决此问题相比,更好的解决方案是重新设计每个控制器的唯一接口。一旦有了唯一的接口类型,DI容器将自动向每个控制器注入正确的服务

选择1 使用通用接口

public interface IMyInterface<T>
{
}

public class XController
{
    private readonly IMyInterface<XClass> myInterface;

    public XController(IMyInterface<XClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

public class YController
{
    private readonly IMyInterface<YClass> myInterface;

    public YController(IMyInterface<YClass> myInterface)
    {
        this.myInterface = myInterface;
    }
}

你的问题是关于战略和/或门面,但根据你的问题,这两个方面如何有用还不清楚。您是否试图按控制器对
IMyInterface
类型进行条件解析?换句话说,为什么要使用标准来选择每个控制器的
IMyInterface
实现?i、 “是的,我正试着去做。“if(XController)用于IMyInterface MyClass1 if(YController)用于IMyInterface MyClass2”。我搜索了stackoverflow,但到目前为止没有找到任何答案。要使用策略模式,请参阅。这就是说,这看起来更像是一个设计问题——因为两个
IMyInterface
实例没有在同一个控制器中使用,所以应该创建专用接口(
public interface IXControllerMyInterface:IMyInterface{}
public interface IYControllerMyInterface:IMyInterface{}
)并在容器中注册每个类型,因为这里没有实际的运行时交换。我想我理解你的意思。我还没有找到一种方法用Unity解决这个问题,这也是我不使用Unity的原因之一。其他容器(如StructureMap或Autofac)允许您仅指定一个参数,而其他容器保持其默认值。但是,我的建议是不要在这个场景中使用策略模式,因为在这里使用它没有意义。相反,您应该将接口设计为唯一的(一种方法是
IMyInterface
,这样您就有了一个与控制器类型匹配的接口类型)。您的问题是关于策略和/或外观,但根据您的问题,尚不清楚这两种接口如何有用。您是否试图按控制器对
IMyInterface
类型进行条件解析?换句话说,为什么要使用标准来选择每个控制器的
IMyInterface
实现?i、 “是的,我正试着去做。“if(XController)用于IMyInterface MyClass1 if(YController)用于IMyInterface MyClass2”。我搜索了stackoverflow,但到目前为止没有找到任何答案。要使用策略模式,请参阅。这就是说,这看起来更像是一个设计问题——因为两个
IMyInterface
实例没有在同一个控制器中使用,所以应该创建专用接口(
public interface IXControllerMyInterface:IMyInterface{}
public interface IYControllerMyInterface:IMyInterface{}
)并在容器中注册每个类型,因为这里没有实际的运行时交换。我想我理解你的意思。我还没有找到一种方法用Unity解决这个问题,这也是我不使用Unity的原因之一。其他容器(如StructureMap或Autofac)允许您仅指定一个参数,而其他容器保持其默认值。但是,我的建议是不要在这个场景中使用策略模式,因为在这里使用它没有意义。您应该将接口设计为唯一的(一种方法是
IMyInterface
,这样您就有了一个与控制器类型匹配的接口类型)。
public interface IMyInterface
{
}

public interface IXMyInterface : IMyInterface
{
}

public interface IYMyInterface : IMyInterface
{
}

public class XController
{
    private readonly IXMyInterface myInterface;

    public XController(IXMyInterface myInterface)
    {
        this.myInterface = myInterface;
    }
}

public class YController
{
    private readonly IYMyInterface myInterface;

    public YController(IYMyInterface myInterface)
    {
        this.myInterface = myInterface;
    }
}