解决默认实例,如果没有在Unity中找到别名

本文关键字:别名 Unity 默认 实例 如果没有 解决 | 更新日期: 2023-09-27 18:17:30

我有以下容器

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返回,如果别名不是其中注册的,例如如果别名被传递为"SEVEN",那么它应该返回FooOne

有办法实现吗?

注意:我不想在容器注册器上有一个循环…

请帮

解决默认实例,如果没有在Unity中找到别名

使用容器的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);