依存性注入にかなり新しく、これが反パターンであるかどうかを判断しようとしています。依存性注入を使用した依存性注入器の注入
のは、私が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からのものを必要とします。これは、ある種の循環依存を作成します。
私が使用しているDependency Injectionフレームワーク(この場合はNInject)を代理するFoo.Sharedのインターフェイスを定義しました。コンテナアプリケーションで
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.Payment.SomeType
の新しいオブジェクトをインスタンス化することができますFooの内部から直接参照を必要としないユーザ:
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
クラスの正確な依存関係がどのようなものであるか不明確になります。これは良い方法ではないと思います。
どのようにこれを達成できますか?
どのような考えですか?
+1舌トライスターのタイトルです。 – womp
ここに同じ、私はタイトルが大好きです:) –