C#、MVC4、StructureMap などを使用した Web ソリューションで作業しています。
ソリューションには、コントローラー用のサービスがあります。例によって:
public class ServiceA{
private readonly IRepository _repository1;
private readonly IRepository _repository2;
public ServiceA(IRepository1 repository1, IRepository2 repository2){
_repository1=repository1;
_repository2=repository2;
}
public void DoSomethingA(){
_repository1.DoSomething();
}
public void DoSomethingB(){
_repository2.DoSomething();
}
}
public class ServiceB{
private readonly IRepository _repository3;
private readonly IRepository _repository4;
public ServiceB(IRepository3 repository3, IRepository4 repository4){
_repository3=repository3;
_repository4=repository4;
}
public void DoSomethingA(){
_repository3.DoSomething();
}
public void DoSomethingB(){
_repository4.DoSomething();
}
}
これを行うのは良い習慣ですか?:
public abstract class ServiceBase(){
public IRepository1 Repository1 { get { return instanceOf<IRepository1>(); }}
public IRepository2 Repository2 { get { return instanceOf<IRepository2>(); }}
public IRepository3 Repository3 { get { return instanceOf<IRepository3>(); }}
public IRepository4 Repository4 { get { return instanceOf<IRepository4>(); }}
private T instanceOf<T>()
{
return ServiceLocator.Current.GetInstance<T>();
}
}
そして、この方法でサービスを作成しますか?
public class ServiceA : ServiceBase
{
public void DoSomethingA(){
Repository1.DoSomething();
}
public void DoSomethingB(){
Repository2.DoSomething();
}
}
public class ServiceB : ServiceBase
{
public void DoSomethingA(){
Repository3.DoSomething();
}
public void DoSomethingB(){
Repository4.DoSomething();
}
}
2番目のオプションには、特定の利点があります。
- リポジトリごとにプライベート変数を持つ必要はありません。
- サービスのコンストラクターは必要ないので、サービスを小さくして読みやすくします。
- すべてのリポジトリは、どのサービスでも利用できます。
- サービスは不要なインスタンスを取得しません。たとえば、get onlyインスタンス
ServiceA
のメソッドを呼び出します。(最初のメソッドを使用すると、 forとの 2 つのインスタンスを受け取ります)DoSomethingA
ServiceLocator
Repository1
Repository1
Repository2
どちらの場合も、適切なテストを行うことができます。
- 最初のケースでは、モック化されたオブジェクトをコンストラクターを介して送信します。
- 2 番目のケースでは、必要に応じてモック オブジェクトを使用するように StructureMap を構成します。
と思いますか?私はいくつかの原則に反していますか?(私の英語でごめんなさい)