Unity DI调用一个注入的方法

Unity DI call an injected method

我在 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 );
}

目标 class 看起来像这样:

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

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

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

您的 MyClass.MyMethod 用于 初始化 MyClassIMyInterface。但是,这会导致 Temporal Coupling code smell.

虽然方法注入本身并不是一个坏习惯,但是在 Composition Root 中使用它来初始化一个 class 是。相反,您应该完全依赖 构造函数注入 作为构建对象图的方法。换句话说,将 class 更改为以下内容:

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
    }
}

这简化了您的 Composition Root,因为它消除了以复杂且类型不安全的方式指定必须调用 MyMethod 的需要,并在依赖项缺失的情况下为您提供更短的反馈周期.此外,它允许 DoSomething 调用 MyMethod,因为 IMyInterface 将保证在那个时候可用。