我正在尝试从统一开始,我正在寻求解决这个特定问题的帮助:我已经了解依赖注入/统一是什么以及如何以编程方式执行此操作,但我不明白成员是如何/何时填充的标有依赖属性。
class Program
{
static Program()
{
uContainer = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(uContainer);
}
private static IUnityContainer uContainer;
[InjectionMethod]
public static void InjectTrace(ITraceManager traceManager)
{
trace = traceManager;
}
[Dependency]
public static ITraceManager trace { get; set; }// = /*new WebTraceManager("C:\\","trace",true);//*/new EnterpriseLibaryLoggingWrapper(false);
static void Main(string[] args)
{
//Programmatically inject dependency
// TODO: Do this via attributes
//UnityContainer myContainer = new UnityContainer();
//UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//section.Containers["containerOne"].Configure(myContainer);
//trace = myContainer.Resolve<ITraceManager>();
trace.ProgramStatus("Start");
trace.ProgramStatus("End");
Console.ReadLine();
}
}
Main 中以编程方式设置跟踪属性的未注释部分工作正常。但是使用属性“依赖”属性将不会被填充。是否缺少对统一容器的调用?谢谢您的帮助。
根据史蒂夫的建议,我更改了示例,使用实例而不是静态类:
static Program()
{
uContainer = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(uContainer);
Instance = uContainer.Resolve<Program>();
}
Program(ITraceManager traceManager)
{
trace = traceManager;
}
static readonly Program Instance;
//Do not use Dependency Attribute
//[Dependency]
public ITraceManager trace { get; set; }// = /*new WebTraceManager("C:\\","trace",true);//*/new EnterpriseLibaryLoggingWrapper(false);
static void Main(string[] args)
{
Instance.Run();
}
void Run()
{
trace.ProgramStatus("Start");
trace.ProgramStatus("End");
Console.ReadLine();
}
但是打电话的时候
Instance = uContainer.Resolve<Program>();
,我收到一个异常告诉我,该程序未在容器中注册。那是真的,但是 Unity 不应该通过程序代码已知类型的 Program 来返回具有已解决依赖关系的程序吗?我在网上找到的例子总是像这样使用构造函数注入
IUnityContainer uContainer = new UnityContainer();
MyObject myInstance = uContainer.Resolve<MyObject>();
终于找到了注入构造函数示例的问题,当然构造函数必须是PUBLIC。异常消息让我有点困惑。