找不到名称时,统一容器可以解析默认类型吗?

Th3*_*B0Y 3 .net c# unity-container

是否可以注册相同的接口两次,其中第一个解析为默认实现,第二个具有名称并解析为另一种类型。

例子:

container.RegisterType(typeof(IMyInterface), typeof(MyDefaultImplementation));
container.RegisterType(typeof(IMyInterface), typeof(MySecondImplementation),"Second Implementations name");
Run Code Online (Sandbox Code Playgroud)

所以,

Resolve<IMyInterface>("non existing name")
Run Code Online (Sandbox Code Playgroud)

应该解决 MyDefaultImplementation。

smo*_*nes 5

如果您可以使用容器,则可以执行扩展方法:

public static class UnityExtensions
{
    public static T TryResolve<T>(this IUnityContainer container, string name)
    {
        if (container.IsRegistered<T>(name))
            return container.Resolve<T>(name);

        return container.Resolve<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

container.RegisterType<IMyInterface, Foo>();
container.RegisterType<IMyInterface, Bar>("bar");

var foo = container.TryResolve<IMyInterface>("non-existing");
// foo will be Foo
var bar = container.TryResolve<IMyInterface>("bar");
// bar will be Bar.

public interface IMyInterface { }
public class Foo : IMyInterface { }
public class Bar : IMyInterface { }
Run Code Online (Sandbox Code Playgroud)

缺点是您需要知道何时使用扩展名,何时不使用...否则您可以构建自己的BuilderStrategy.

受以下因素影响较大:

Unity - loadConfiguration,如何只解析那些已配置的

Unity 中有 TryResolve 吗?