【发布时间】:2018-02-14 13:43:08
【问题描述】:
我的计算器配置依赖于其视图 (GUI) 的定义如下(然后在当前上下文中解析):
Dependencies.register<IView, View>(
"standardView"
);
//Register: calculator release configuration
Dependencies.register<ICalculator, Calculator>(
"releaseCalculator",
(new InjectionProperty(
"IView",
Dependencies.resolve<IView>("standardView")
))
);
//Resolve:
Calculator theCalculator = (Calculator)Dependencies.resolve<ICalculator>(
"releaseCalculator"
);
Dependencies 是 IUnityContainer 的包装器。
Calculator 中的注入点是:
private IView view;
[Dependency]
public IView IView{
get{return view;}
set{view = value;}
}
如果您希望查看 Dependencies 的定义,请注意它绝对等同于统一容器的投影,除非我已经扩展了对生命周期管理器的直接控制。
问题很简单;鉴于上述设置,Property IView 在运行时解析为 null。就好像 Unity 根本无法正常工作。
@Haukinger 这是包装器:
using System.Collections.Generic;
using Unity;
using Unity.Lifetime;
using Unity.Registration;
namespace Calculator.Utils
{
public static class Dependencies
{
private static IUnityContainer graph;
private static List<KeyValuePair<string, LifetimeManager>> lifetimeManagers;
static Dependencies(){
//container
graph = new UnityContainer();
//instance managers 1 per dependency instance (implementor)
lifetimeManagers = new List<KeyValuePair<string, LifetimeManager>>();
}
//STATES:
public static void register<I, P>(string alias, params InjectionMember[] injections)
{
ContainerControlledTransientManager newLM = new ContainerControlledTransientManager();
lifetimeManagers.Add(new KeyValuePair<string, LifetimeManager>(
alias,
newLM
));
graph.RegisterType(
typeof(I),
typeof(P),
alias,
newLM,
injections
);
}
//function is identitical to Resolve
public static T resolve<T>(string alias)
{
return (T)graph.Resolve(typeof(T), alias);
}
public static void dispose(string alias)
{
LifetimeManager target = (ContainerControlledTransientManager)lifetimeManagers.Find((elem)=>(elem.Key.Equals(alias))).Value;
target.Dispose();
}
}
}
【问题讨论】:
标签: c# .net dependency-injection properties unity-container