私たちのコードベースには、基本的に単なる配管であり、次のような多くのメソッドがあります。
public void Execute()
{
_performanceLogger.Log("Start");
var chunks = GetChunksToWorkOn();
Parallel.ForEach(chunks , chunk =>
{
using (var container = ObjectFactory.Container.GetNestedContainer())
{
using (var unitOfWork = new UnitOfWork())
{
container.GetInstance<Worker>().Execute(chunk);
unitOfWork.Commit();
}
}
});
_performanceLogger.Log("Done");
}
これらの呼び出しを置き換えるテンプレート メソッドを作成することを考えていました。
public interface IProcessInParallel
{
void Execute<T>(Func<IEnumerable<IEnumerable<object>>> funcToRetrieveChunksOfWorkForEachParallelProcess) where T : IProcessInParallelTask;
}
public interface IProcessInParallelTask
{
void DoWork(IEnumerable<object> objects);
}
public class ProcessInParallel : IProcessInParallel
{
private readonly IPerformanceLogger _performanceLogger;
public ProcessInParallel(IPerformanceLogger performanceLogger)
{
_performanceLogger = performanceLogger;
}
public void Execute<T>(Func<IEnumerable<IEnumerable<object>>> funcToRetrieveChunksOfWorkForEachParallelProcess) where T : IProcessInParallelTask
{
_performanceLogger.Log("Start");
var chunks = funcToRetrieveChunksOfWorkForEachParallelProcess.Invoke();
Parallel.ForEach(chunks, chunk =>
{
using (var container = ObjectFactory.Container.GetNestedContainer())
{
using (var unitOfWork = new UnitOfWork())
{
container.GetInstance<T>().DoWork(chunk);
unitOfWork.Commit();
}
}
});
_performanceLogger.Log("Done");
}
}
このアプローチの唯一の問題は、それがオブジェクトを使用していることです...これは醜くて安全ではなく、キャストを引き起こします。
私は自分のパターンブックを閲覧していますが、まだ正しい解決策を見つけていません.
助言がありますか?