1

我正在尝试从统一开始,我正在寻求解决这个特定问题的帮助:我已经了解依赖注入/统一是什么以及如何以编程方式执行此操作,但我不明白成员是如何/何时填充的标有依赖属性。

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。异常消息让我有点困惑。

4

1 回答 1

7

几点:

  • 您目前似乎完全用 XML 配置容器。不要那样做!您应该只配置在 XML 中构建(部署配置)后可以实际更改的依赖项。其余的,使用基于代码的配置,因为基于 XML 的配置非常脆弱,缺乏编译时支持,缺乏智能感知支持,缺乏表现力。
  • 不要使用方法注入来初始化组件。这导致了时间耦合。注入依赖的主要方式是使用构造函数注入。定义对构造函数参数的所有依赖项。所有具有依赖关系的类型都应该有一个包含所有需要的依赖关系的公共构造函数。Unity 将自动找到该构造函数并知道如何调用该构造函数并注入依赖项。
  • 根本不要使用属性!这会将您的代码与使用的容器耦合,而应用程序代码应该忽略 DI 容器的存在。同样,坚持构造函数注入。
于 2012-06-01T09:43:22.277 回答