我有一个包含3种不同实现的界面。我使用Unity Container在Web应用程序的Web.config中将3个实现注册为命名别名。
有没有办法使用Unity,根据某些逻辑解析其中一个已注册的实例。逻辑包括联系DB以决定要解决的实现。
感谢您的帮助。
此致 比拉尔
答案 0 :(得分:2)
您可以在抽象工厂中实现逻辑并将其注入:
public interface IMyInterface { }
public interface IMyInterfaceFactory {
IMyInterface GetMyInterface();
}
public class MyInterfaceFactory : IMyInterfaceFactory {
private readonly IUnityContainer _container;
public MyInterfaceFactory(IUnityContainer container) {
_container = container; }
IMyInterface GetMyInterface() {
var impName = Get_implementation_name_from_db();
return container.Resolve<IMyInterface>(impName);
}
}
答案 1 :(得分:1)
您可以创建一个“路由器”实现,该实现知道如何将请求路由到其他实现之一:
// Here is a possible implementation of the router. There are
// of course many ways to do this.
public class MyRouterImpl : IMyInterface
{
List<IMyInterface> implementations = new List<IMyInterface>();
public MyRouterImpl(MyImpl1 i1, MyImpl2 i2, MyImpl3 i3)
{
this.implementations.Add(i1);
this.implementations.Add(i2);
this.implementations.Add(i3);
}
void IMyInterface.Method()
{
int indexOfImplementationToExecute =
GetIndexOfImplementationToExecute();
IMyInterface impl =
this.implementations[indexOfImplementationToExecute];
impl.Method();
}
}