我正在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 ?
答案 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
那时是可用的。