5

エンティティ フレームワークを操作するためのちょっとクールな作業単位を実装できました。

私が思いついた..

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 ファクトリーはどうですか?

これを修正する方法についてのアイデアや提案はありますか?

ありがとう。

4

1 に答える 1

7

現在のアーキテクチャを使用する場合は、UnitOfWorkをサービスに注入する必要があります。あなたのサービスはUnitOfWork実装への内部(隠された)依存関係を持たず、より良いテストが可能になります。これは、オブジェクト指向アーキテクチャの多くの原則と密接に関連しています。

もう1つは、この実装は単純なCRUD操作にのみ使用できるということです。より複雑なサービスでは、それぞれがUnitOfWorkで動作する複数の操作(おそらく複数のサービスから)を構成することになります。1つのビジネスオペレーションで複数のSaveChanges(およびトランザクション)を呼び出すことは、おそらく通常は必要ありません。このような場合、トップレベルのサービスまたはサービスの呼び出し元からSaveChangesを1回だけ呼び出します。典型的なシナリオは、単一のビジネスオペレーションには、1つのトランザクションで1つの作業単位がありますが、このビジネスオペレーションの一部として、多くのサービスのオペレーションを実行できます。

もう1つの意味は、リポジトリの構築です。彼らはおそらくデータベースにアクセスする必要がありますね。したがって、おそらくすでにUoWをリポジトリコンストラクターに注入しています。これを行うと、UoWと基本サービスの関係を完全に回避できます。

于 2011-02-06T12:39:38.713 に答える