Chèn mới vào phụ thuộc khá mới và tôi đang cố gắng tìm hiểu xem đây có phải là một mẫu chống.Tiêm Khẩu phụ thuộc bằng cách sử dụng Injection Dependency
Hãy nói rằng tôi có 3 cụm:
Foo.Shared - this has all the interfaces
Foo.Users - references Foo.Shared
Foo.Payment - references Foo.Shared
Foo.Users cần một đối tượng mà được xây dựng trong vòng Foo.Payment, và Foo.Payment cũng cần công cụ từ Foo.Users. Điều này tạo ra một số loại phụ thuộc vòng tròn.
Tôi đã xác định một giao diện trong Foo.Shared rằng proxy khuôn khổ Dependency Injection tôi đang sử dụng (trong trường hợp này là NInject).
public interface IDependencyResolver
{
T Get<T>();
}
Trong ứng dụng container, Tôi có một thực hiện của giao diện này:
public class DependencyResolver:IDependencyResolver
{
private readonly IKernel _kernel;
public DependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
public T Get<T>()
{
return _kernel.Get<T>();
}
}
Cấu hình trông như thế này:
public class MyModule:StandardModule
{
public override void Load()
{
Bind<IDependencyResolver>().To<DependencyResolver>().WithArgument("kernel", Kernel);
Bind<Foo.Shared.ISomeType>().To<Foo.Payment.SomeType>(); // <- binding to different assembly
...
}
}
này cho phép tôi để tạo một đối tượng mới của Foo.Payment.SomeType
từ bên trong Foo.Người dùng mà không cần tham chiếu trực tiếp:
public class UserAccounts:IUserAccounts
{
private ISomeType _someType;
public UserAccounts(IDependencyResolver dependencyResolver)
{
_someType = dependencyResolver.Get<ISomeType>(); // <- this essentially creates a new instance of Foo.Payment.SomeType
}
}
Điều này làm cho nó không rõ ràng những gì phụ thuộc chính xác của lớp UserAccounts
là trong trường hợp này, mà làm cho tôi nghĩ rằng nó không phải là một thực hành tốt.
Tôi có thể thực hiện việc này bằng cách nào khác?
Mọi suy nghĩ?
+1 chỉ dành cho tiêu đề twister lưỡi. – womp
cùng ở đây, tôi yêu tiêu đề :) –