如果在 Unity 中找不到别名,则解析默认实例
Resolving Default Instance if no Alias is found in Unity
我有以下容器
IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<IFoo, FooThree>("Three");
container.RegisterType<IFoo, FooFour>("Four");
container.RegisterType<IFoo, FooFive>("Five");
container.RegisterType<IFoo, FooSix>("Six");
现在当我访问它时,我使用
IFoo foo = container.Resolve<IFoo>(AliasString);
现在的问题是我正在从用户那里获取别名字符串,如果别名不在已注册的别名中,我想对 FooOne 进行 returned,例如
如果别名作为 "SEVEN" 传递,那么它应该 return FooOne
有什么办法可以实现吗?
注意:我不想在容器注册者上出现循环...
请帮忙
使用容器的IsRegistered方法:
IFoo foo;
if (Container.IsRegistered<IFoo>(AliasString))
{
foo = container.Resolve<IFoo>(AliasString);
}
else
{
foo = container.Resolve<IFoo>("One");
}
要排除循环检查,您可以将其包装到某个工厂:
public class Factory
{
private readonly IUnityContainer _container;
private readonly HashSet<string> _classes = new HashSet<string>();
public Factory(IUnityContainer container)
{
_container = container;
}
public void Register<TInterface, TClass>(string alias) where TClass : TInterface
{
_classes.Add(alias);
_container.RegisterType<TInterface, TClass>(alias);
}
public TInterface Resolve<TInterface>(string alias)
{
if (_classes.Contains(alias))
return _container.Resolve<TInterface>(alias);
return _container.Resolve<TInterface>("default");
}
}
var factory = new Factory(container);
factory.Register<IFoo, FooOne>("One");
IFoo foo = factory.Resolve<IFoo>(AliasString);
我有以下容器
IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<IFoo, FooThree>("Three");
container.RegisterType<IFoo, FooFour>("Four");
container.RegisterType<IFoo, FooFive>("Five");
container.RegisterType<IFoo, FooSix>("Six");
现在当我访问它时,我使用
IFoo foo = container.Resolve<IFoo>(AliasString);
现在的问题是我正在从用户那里获取别名字符串,如果别名不在已注册的别名中,我想对 FooOne 进行 returned,例如 如果别名作为 "SEVEN" 传递,那么它应该 return FooOne
有什么办法可以实现吗?
注意:我不想在容器注册者上出现循环...
请帮忙
使用容器的IsRegistered方法:
IFoo foo;
if (Container.IsRegistered<IFoo>(AliasString))
{
foo = container.Resolve<IFoo>(AliasString);
}
else
{
foo = container.Resolve<IFoo>("One");
}
要排除循环检查,您可以将其包装到某个工厂:
public class Factory
{
private readonly IUnityContainer _container;
private readonly HashSet<string> _classes = new HashSet<string>();
public Factory(IUnityContainer container)
{
_container = container;
}
public void Register<TInterface, TClass>(string alias) where TClass : TInterface
{
_classes.Add(alias);
_container.RegisterType<TInterface, TClass>(alias);
}
public TInterface Resolve<TInterface>(string alias)
{
if (_classes.Contains(alias))
return _container.Resolve<TInterface>(alias);
return _container.Resolve<TInterface>("default");
}
}
var factory = new Factory(container);
factory.Register<IFoo, FooOne>("One");
IFoo foo = factory.Resolve<IFoo>(AliasString);