サービスロケーターと依存性インジェクターの違いについての詳細な議論があった前の議論を行っていましたが、それでも私はそれを得ることができません. コードなしで一般的な応答を取得できますか?
2 に答える
このコード サンプルは、依存性注入の原則を適用します。
public class UserService : IUserService
{
private IUserRepository repository;
// Constructor taking dependencies
public UserService(IUserRepository repository)
{
this.repository = repository;
}
}
このコード サンプルでは、Service Locatorパターンを使用しています。
public class UserService : IUserService
{
private IUserRepository repository;
public UserService()
{
this.repository = ObjectFactory.GetInstance<IUserRepository>();
}
}
これは Service Locator パターンの実装です。
public class UserService : IUserService
{
private IUserRepository repository;
public UserService(Container container)
{
this.repository = container.GetInstance<IUserRepository>();
}
}
これも Service Locator パターンの実装です。
public class UserService : IUserService
{
private IUserRepository repository;
public UserService(IServiceLocator locator)
{
this.repository = locator.GetInstance<IUserRepository>();
}
}
違いは、依存性注入では、消費者が必要とするすべての依存関係を消費者に注入することです (ただし、他には何も注入しません)。それを注入する理想的な方法は、コンストラクターを使用することです。
Service Locator を使用して、共有ソースから依存関係を要求します。最初の例では、これは静的ObjectFactory
クラスでしたが、2 番目の例では、これはContainer
コンストラクターに注入されたインスタンスでした。コンテナー自体は依存性注入を使用して注入されますが、最後のコード スニペットはまだ Service Locator パターンの実装です。
Service Locator よりも依存性注入を使用する必要がある重要な理由があります。この記事はそれをうまく説明しています。
サービス ロケータを使用する場合、通常、あるオブジェクトに別のオブジェクトを作成するように明示的に要求することを意味します。これは通常、アンチパターンと見なされます。依存性注入は逆です。
武器を持つ戦士というクラスがあるとします。サービス ロケーターを使用して、Warrior のコンストラクターでサービス ロケーターに武器を要求します。
依存性注入を使用すると、明示的に要求しなくても、Warrior のコンストラクターに Weapon が注入されます。