使用命名参数注册 Singleton 时 Unity Resolution 失败

Unity Resolution fails when Singleton is registered with named parameter

我有以下class和接口定义:

interface IView { ... }

interface IViewA : IView { ... }
interface IViewB : IView { ... }

class ViewA : IViewA { ... }
class ViewB : IViewB { ... }

class Controller
{
     public Controller(IViewA view) { ... }
}

然后我像这样在统一容器中注册它们:

unityContainer.RegisterSingleton<IViewA, ViewA>("TheTestViewA");
unityContainer.RegisterSingleton<IViewB, ViewB>("TheTestViewB");
unityContainer.RegisterSingleton<Controller>();

然而,当我请求控制器的实例时,unity 抛出异常。

unityContainer.Resolve<Controller>();

Resolution failed with error: No public constructor is available for type IViewA.

似乎是要构造接口而不是class。我还发现,当我省略命名参数“TheTestViewA”时,它工作正常。但是我需要该参数,因为稍后我需要 container.ResolveAll<IView>() ,它仅在映射具有名称时才有效。 ( ResolveAll not working )

异常令人困惑,但实际情况是 Unity 找不到 IView 的注册。为了能够将 IView 注入 Controller,它需要对 IView 进行匿名注册,但它所拥有的只是一个命名注册 (TheTestViewA)。

由于缺少 IView 的注册,Unity 假定 IView 是具体类型并尝试实例化它。但是 IView 没有构造函数(因为它是一个接口),因此是例外。

您可以试试下面的代码:

var unityContainer = new UnityContainer();

unityContainer.RegisterSingleton<ViewA>();
unityContainer.RegisterSingleton<IViewA, ViewA>();
unityContainer.RegisterSingleton<IViewB, ViewB>();
            
unityContainer.RegisterFactory<IView>("A", c => c.Resolve<IViewA>(), new SingletonLifetimeManager());
unityContainer.RegisterFactory<IView>("B", c => c.Resolve<IViewB>(), new SingletonLifetimeManager());

unityContainer.RegisterSingleton<Controller>();