使用命名参数注册 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>();
我有以下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>();