Giả sử tôi có các Service
phụ thuộc nhận thông qua hàm tạo nhưng cũng cần được khởi tạo với dữ liệu tùy chỉnh (ngữ cảnh) trước khi có thể sử dụng:
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;
}
Bây giờ - dữ liệu ngữ cảnh không được biết trước nên tôi không thể đăng ký dưới dạng phụ thuộc và sử dụng DI để đưa dữ liệu vào dịch vụ
Đây là ví dụ khách hàng trông như thế nào:
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();
}
}
Như bạn có thể thấy - có khớp nối tạm thời và khởi tạo mã phương thức có liên quan, bởi vì trước tiên tôi cần gọi service.Initialize
để có thể gọi service.DoSomething
và service.DoOtherThing
sau đó.
Các phương pháp khác mà tôi có thể loại bỏ những vấn đề này là gì?
Làm rõ thêm về hành vi:
Mỗi phiên bản của máy khách cần có phiên bản riêng của dịch vụ được khởi tạo với dữ liệu ngữ cảnh cụ thể của máy khách. Vì vậy, dữ liệu ngữ cảnh đó không phải là tĩnh hoặc được biết trước vì vậy nó không thể được DI đưa vào trong hàm tạo.