こんにちは、Unity を使用してサービス レイヤーを管理しています。これは、すべてのリポジトリを管理する UnitOfWork と通信します。
一部のサービスは他のサービスを呼び出します。質問は、サービス レイヤー間で同じ UnitOfWork を渡すにはどうすればよいですか?
私の場合、すべてのコントローラー アクションは、タイマーの各ボタン アクションまたはイベントの GUI から開始されます。これが、必要に応じて UnitOfWork を作成するファクトリがある理由ですが、この UnitOfWork をサービス間で渡す方法がわからないため、問題が発生しています。 .
特に難しいのは、この特定の UnitOfWork インスタンスをサービス コンストラクターに挿入する方法を知ることです。一部のサービスは長時間 (バックグラウンド スレッドで 10 分程度) 実行される可能性があることに注意してください。それが設計に影響を与えるかどうかはわかりません。
現在、他のサービスから呼び出されたサービスは独自の UnitOfWork を作成しており、トランザクション設計とエンティティ フレームワーク エンティティ トラッキングの両方で問題が発生しています。
提案は大歓迎です!
class OtherService : IOtherService
{
public OtherService(IUnitOfWorkFactory unitOfworkFactory,
ISettingsService settingsService)
{
UnitOfWorkFactory = unitOfworkFactory;
SettingsService = settingsService;
}
IUnitOfWorkFactory UnitOfWorkFactory;
ISettingsService SettingsService;
function SomeSeviceCall()
{
// Perhaps one way is to use a factory to instantiate a
// SettingService, and pass in the UnitOfWork here?
// Ideally it would be nice for Unity to handle all of
// the details regardless of a service being called from
// another service or called directly from a controller
// ISettingsService settingsService =
// UnityContainer.Resolve<ISettingService>();
using (var uow = UnitOfWorkFactory.CreateUnitOfWork())
{
var companies = uow.CompaniesRepository.GetAll();
foreach(Company company in companies)
{
settingsService.SaveSettings(company, "value");
company.Processed = DateTime.UtcNow();
}
uow.Save();
}
}
}
class SettingsService : ISettingsService
{
public SettingsService(IUnitOfWorkFactory unitOfworkFactory)
{
UnitOfWorkFactory = unitOfworkFactory;
}
IUnitOfWorkFactory UnitOfWorkFactory;
// ISettingsService.SaveSettings code in another module...
function void ISettingsService.SaveSettings(Company company,
string value)
{
// this is causing an issue as it essentially creates a
// sub-transaction with the new UnitOfWork creating a new
// Entiy Framework context
using (var uow = UnitOfWorkFactory.CreateUnitOfWork())
{
Setting setting = new Setting();
setting.CompanyID = company.CompanyID;
setting.SettingValue = value;
uow.Insert(setting);
uow.Save();
}
}
}