それらを処理する 1 つの方法は、集約 (またはファサード) に向けてリファクタリングすることです。Mark Seemannはそれについて良い記事を書いています。したがって、次のものがあるとします(記事から抜粋):
public OrderProcessor(IOrderValidator validator,
IOrderShipper shipper,
IAccountsReceivable receivable,
IRateExchange exchange,
IUserContext userContext)
次のようにリファクタリングできます。
public OrderProcessor(IOrderValidator validator,
IOrderShipper shipper,
IOrderCollector collector)
ファサードはどこOrderCollector
にありますか (前の 3 つの依存関係をラップします):
public OrderCollector(IAccountsReceivable receivable,
IRateExchange exchange,
IUserContext userContext)
これが役立つことを願っています。
編集
分野横断的な問題 (たとえば、ロギングとキャッシング) とそれらを処理するための戦略に関して、ここに提案があります (これは私が通常行うことです)。
public interface IOrderService
{
void DoAwesome();
}
public class OrderService : IOrderService
{
public void DoAwesome()
{
// do your thing here ... no logging no nothing
}
}
ここでは、decorator パターンを使用して、ロギングが有効になっている OrderService を作成します。
public class OrderServiceWithLogging : IOrderService
{
private readonly IOrderService _orderService;
private readonly ILogger _logger;
public OrderServiceWithLogging(IOrderService orderService, ILogger logger)
{
_orderService = orderService;
_logger = logger;
}
public void DoAwesome()
{
_orderService.DoAwesome();
_logger.Log("Awesome is done!");
}
}
少しオーバーヘッドがかかるように見えるかもしれませんが、私見ですが、クリーンでテスト可能です。
もう 1 つの方法は、アスペクト指向プログラミングに進み、基本的に特定のメソッド呼び出しをインターセプトし、結果としてタスクを実行するインターセプションなどの概念を調べることです。多くの DI フレームワーク (すべてと言いたいですか?) はインターセプトをサポートしているため、それはあなたが好むものかもしれません。