データベースのISessionContext、ログ用のILogManager、および別のサービスとの通信に使用されるIServiceを必要とする多くのコアクラスがあります。すべてのコアクラスで使用されるこのクラスに依存性注入を使用したい。
2つの可能な実装があります。3つのクラスすべてのIAmbientContextを受け入れるか、3つのクラスすべてのクラスに注入するコアクラス。
public interface ISessionContext
{
...
}
public class MySessionContext: ISessionContext
{
...
}
public interface ILogManager
{
}
public class MyLogManager: ILogManager
{
...
}
public interface IService
{
...
}
public class MyService: IService
{
...
}
最初の解決策:
public class AmbientContext
{
private ISessionContext sessionContext;
private ILogManager logManager;
private IService service;
public AmbientContext(ISessionContext sessionContext, ILogManager logManager, IService service)
{
this.sessionContext = sessionContext;
this.logManager = logManager;
this.service = service;
}
}
public class MyCoreClass(AmbientContext ambientContext)
{
...
}
2番目のソリューション(アンビエントコンテキストなし)
public MyCoreClass(ISessionContext sessionContext, ILogManager logManager, IService service)
{
...
}
この場合、Wichが最良のソリューションですか?
IService
別のサービスとの通信に使用されるもの」とは何ですか?ifIService
が他のサービスへの曖昧な依存関係を表す場合、それはサービスロケータのように聞こえ、存在すべきではありません。クラスは、コンシューマーが何を行うかを明示的に記述するインターフェースに依存する必要があります。サービスへのアクセスを提供するためにサービスを必要とするクラスはありません。クラスには、クラスが必要とする特定のことを行う依存関係が必要です。