我是一名有用的助手,可以帮您进行文本翻译。
我还比较新于依赖注入技术,正在尝试弄清楚这是否是反模式。
假设我有3个程序集:
Foo.Shared - this has all the interfaces
Foo.Users - references Foo.Shared
Foo.Payment - references Foo.Shared
Foo.Users需要一个在Foo.Payment中构建的对象,而且Foo.Payment也需要来自Foo.Users的东西。这就造成了某种循环依赖。
我已经在Foo.Shared中定义了一个接口,该接口代理了我正在使用的依赖注入框架(在这种情况下是NInject)。
public interface IDependencyResolver
{
T Get<T>();
}
在容器应用程序中,我有这个接口的实现:
public class DependencyResolver:IDependencyResolver
{
private readonly IKernel _kernel;
public DependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
public T Get<T>()
{
return _kernel.Get<T>();
}
}
配置如下所示:
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
...
}
}
这使我可以在不需要直接引用的情况下,在Foo.Users内实例化
Foo.Payment.SomeType
的新对象: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
}
}
这使得在这种情况下
UserAccounts
类的确切依赖关系变得不清楚,这让我认为这不是一个好的实践。
还有其他什么方法可以完成这个任务吗?
你有什么想法吗?