エンティティ フレームワークを操作するためのちょっとクールな作業単位を実装できました。
私が思いついた..
public class UnitOfWork : IUnitOfWork
{
private Database _database;
private IDatabaseFactory _databaseFactory;
private DbTransaction transaction;
public UnitOfWork(IDatabaseFactory databaseFactory)
{
_databaseFactory = databaseFactory;
_database = Database;
transaction = _database.Database.Connection.BeginTransaction();
}
public Database Database
{
get { return _database ?? (_database = _databaseFactory.Get()); }
}
public void Dispose()
{
try
{
_database.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
}
今では誰もがこの作業単位に嫉妬していると確信しています。(冗談)
しかし、このサービス層には少し設計上の問題があります。
public class JournalService : IJournalService
{
IJournalRepository _journalRepository;
public JournalService(IJournalRepository journalRepository)
{
_journalRepository = journalRepository;
}
public void AjouterJournal(Journal j)
{
[B]using (IUnitOfWork uow = new UnitOfWork())[/B]
{
var journal = new Journal();
journalRepository.AddJournal(journal);
}
}
}
問題は、作業単位がデータベース インジェクションを必要とするため、そのインスタンスを作成できないことです。作業単位は使い捨てである必要があるため、意味がないため、サービス層で直接作業単位を提供することはできません。
また、リポジトリを使用して自分のものを追加するため、作業単位に直接アクセスする必要はありません。とにかく破棄されると、保存が自動的に行われます。
サービス層に IDatabaseFactory を挿入することはできますが、そこでは使用しないという考えです。実際、サービス層はそれについて知っているべきではありません。
UnitOfWork ファクトリーはどうですか?
これを修正する方法についてのアイデアや提案はありますか?
ありがとう。