C# 如何使用Unity Dependency注入Web API实现策略/外观模式
如何告诉Unity.WebApi依赖注入框架,在正确的控制器中注入正确的类 DI项目容器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) {
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;
}
}