Unity DI调用注入方法

时间:2018-10-14 12:10:09

标签: c# dependency-injection unity-container

我正在Unity中使用C#4.7.2和PRISM 6

我注册了InjectionMethod来调用 MyMethod

private void RegisterMyClass()
{
    object[] parameters = new object[]
    {
       typeof(IMyInterface)
    };


    InjectionMember[] injectionMembers = new InjectionMember[]
    {                
        new InjectionMethod( "MyMethod", parameters )
    };

    container.RegisterType<IMyClass , MyClass>( new TransientLifetimeManager() , injectionMembers );
}

目标类如下:

public MyClass
{
    public void DoSomething()
    {
        MyMethod();
    }

    public void MyMethod( IMyInterface example )
    {
        // ...
    }
}

如何通过DI正常工作的方式从 DoSomething 调用 MyMethod

1 个答案:

答案 0 :(得分:1)

您的copy constructor called id = 2 val = 15 ptr = 0xea4c40 *ptr = 10 id = 1 val = 15 ptr = 0xea4c20 *ptr = 10 用于通过MyClass.MyMethod 初始化 MyClass。但是,这导致了Temporal Coupling code smell

尽管方法注入本身并不是一个坏习惯,但是在Composition Root内使用它来初始化类是一个不错的选择。相反,您应该仅依靠构造函数注入作为构建对象图的方法。换句话说,将类更改为以下内容:

IMyInterface

这简化了您的合成根,因为它消除了以复杂且类型不安全的方式指定必须调用public MyClass { private readonly IMyInterface example; public MyClass(IMyInterface example) { this.example = example ?? throw new ArgumentNullException(nameof(example)); } public void DoSomething() { MyMethod(); } public void MyMethod() { // use this.example } } 的需要,并且在缺少依赖项的情况下为您提供了更短的反馈周期。此外,它还允许MyMethod调用DoSomething,因为可以保证MyMethod那时是可用的。