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
用于 初始化 MyClass
和 IMyInterface
。但是,这会导致 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
将保证在那个时候可用。
我在 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
用于 初始化 MyClass
和 IMyInterface
。但是,这会导致 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
将保证在那个时候可用。