1

だから私が解決しようとしている問題はこれです。Entity Frameworkを使用して、1200〜1500のテーブルを持つOracleデータベースにアクセスしています。すべてにアクセスしているわけではありませんが、800以上のアクセスがある可能性があります。UnitOfWork->リポジトリ->サービスパターンを使用しており、これはうまく機能しますが、1つの大きなDbContextを使用するか、手元のタスクに固有の複数の小さなコンテキストを使用するかを判断しようとしています。

UnitOfWorkは、次のようにEFUnitOfWorkBaseを使用してセットアップされます。

public abstract class EFUnitOfWorkBase : IUnitOfWork
{
    private bool isDisposed = false;

    public DbContextBase Context { get; set; }

    protected EFUnitOfWorkBase(DbContextBase context)
    {
        Context = context;
    }

    public int Commit()
    {
        return Context.SaveChanges();
    }

    public void Dispose()
    {
        if (!isDisposed)
            Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        isDisposed = true;
        if (disposing)
        {
            if (this.Context != null)
                this.Context.Dispose();
        }
    }

    public IRepository<TEntity> GetRepository<TEntity>() where TEntity : Common.EntityBase<TEntity>
    {
        return new Repository<TEntity>(this);
    }
}

私たちが作成する作業単位は、その基本単位を拡張し、次のようなコンテキストを提供します。

public class EmployeeDirectoryUnitOfWork : EFUnitOfWorkBase
{
    public EmployeeDirectoryUnitOfWork(string connectionString)
        : base(new EmployeeDirectoryContext(connectionString))
    {
    }
}

DbContextには、作業単位を介して接続文字列が渡されます。

このRepositoryように見えます:

public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected DbContextBase Context;
    protected DbSet<TEntity> EntitySet;

    public RepositoryBase(EFUnitOfWorkBase unitOfWork)
    {
        Enforce.ArgumentNotNull(unitOfWork, "unitOfWork");

        Context = unitOfWork.Context;
        EntitySet = Context.Set<TEntity>();
    }

    public TEntity Add(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Add(entity);
    }

    public TEntity Attach(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Attach(entity);
    }

    public TEntity Delete(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        return EntitySet.Remove(entity);
    }

    public System.Linq.IQueryable<TEntity> Query()
    {
        return EntitySet.AsQueryable();
    }

    public TEntity Save(TEntity entity)
    {
        Enforce.ArgumentNotNull(entity, "entity");

        Attach(entity);
        Context.MarkModified(entity);

        return entity;
    }
}

この状況に最もよく対処する方法について何か提案はありますか?

4

1 に答える 1

7

このような大規模なアプリケーションがある場合は、おそらくよりドメイン駆動設計のアプローチを採用し、コンテキストをいくつかの個別の制限されたコンテキストに分割する必要があると思います。このように、後の開発者がプロ​​グラムに機能を追加するとき、そこで使用するコンテキストに応じて、特定のテーブルにのみアクセスできるように制限されます。

より良い情報のために、Julie Lermanは最近、エンタープライズのEntityFrameworkに関するPluralsightに関するコースを発表しました。これは本当に良いことです。彼女はそれの小さなクリップ(実際には制限されたコンテキストについて)をこのサイトに投稿しました。これは非常に良いコースであり、特にあなたがしているように見えることには、それを強くお勧めします。

于 2013-02-08T20:31:14.730 に答える