複雑なビジネスロジックは通常、サービスレイヤーに入ります。サービスは、モデルでCRUD操作を実行するために1つまたは複数のリポジトリに依存する場合があります。したがって、ビジネス操作を表す単一のサービス操作は、複数の単純な操作に依存することがあります。その後、コントローラや他のアプリケーションでこのサービス層を再利用することができます。
明らかに、あなたのサービスは特定のリポジトリの実装に依存すべきではありません。サービスレイヤーとリポジトリー間の弱い結合を実現するために、インターフェースを使用することができます。ここに例があります:
public interface IProductsRepository { }
public interface IOrdersRepository { }
...
public interface ISomeService
{
void SomeBusinessOperation();
}
public class SomeServiceImpl: ISomeService
{
private readonly IProductsRepository _productsRepository;
private readonly IOrdersRepository _ordersRepository;
public SomeServiceImpl(
IProductsRepository productsRepository,
IOrdersRepository ordersRepository
)
{
_productsRepository = productsRepository;
_ordersRepository = ordersRepository;
}
public void SomeBusinessOperation()
{
// TODO: use the repositories to implement the business operation
}
}
これで残っているのは、この特定のサービスをコントローラに注入するようにDIフレームワークを構成することです。
public class FooController : Controller
{
private readonly ISomeService _service;
public FooController(ISomeService service)
{
_service = service;
}
public ActionResult Index()
{
// TODO: Use the business operation here.
}
}
どのようにインターフェイスを使用すれば、レイヤ間の結合が弱いのかが分かります。すべての配管はDIフレームワークによって実行され、すべてが透過的で簡単にユニットテスト可能です。
ダーリン、このような状況の中で、さまざまなリポジトリにアクセスするための最良の方法は何ですか単一のサービスから?また、IoC/DIを導入した解決策を教えてください。 – Chandu
ありがとうダーリン! –
説明をありがとうDarin – Chandu