假设我有Service
通过构造函数接收依赖项的,但还需要使用自定义数据(上下文)进行初始化,然后才能使用它:
public interface IService
{
void Initialize(Context context);
void DoSomething();
void DoOtherThing();
}
public class Service : IService
{
private readonly object dependency1;
private readonly object dependency2;
private readonly object dependency3;
public Service(
object dependency1,
object dependency2,
object dependency3)
{
this.dependency1 = dependency1 ?? throw new ArgumentNullException(nameof(dependency1));
this.dependency2 = dependency2 ?? throw new ArgumentNullException(nameof(dependency2));
this.dependency3 = dependency3 ?? throw new ArgumentNullException(nameof(dependency3));
}
public void Initialize(Context context)
{
// Initialize state based on context
// Heavy, long running operation
}
public void DoSomething()
{
// ...
}
public void DoOtherThing()
{
// ...
}
}
public class Context
{
public int Value1;
public string Value2;
public string Value3;
}
现在-上下文数据是事先未知的,因此我无法将其注册为依赖项并使用DI将其注入到服务中
这是示例客户端的样子:
public class Client
{
private readonly IService service;
public Client(IService service)
{
this.service = service ?? throw new ArgumentNullException(nameof(service));
}
public void OnStartup()
{
service.Initialize(new Context
{
Value1 = 123,
Value2 = "my data",
Value3 = "abcd"
});
}
public void Execute()
{
service.DoSomething();
service.DoOtherThing();
}
}
正如你所看到的-有时间耦合和初始化方法代码味道参与,因为我首先需要打电话service.Initialize
到能够调用service.DoSomething
和service.DoOtherThing
事后。
我还有哪些其他方法可以消除这些问题?
有关行为的其他说明:
客户端的每个实例都需要使用客户端的特定上下文数据初始化其自己的服务实例。因此,上下文数据不是静态的,也不是事先已知的,因此DI不能将其注入构造函数中。