2

サービスクラスにジェネリックリポジトリを実装しようとしています。しかし、WebレイヤーでDbConextをバインドしようとすると、EntityFrameworkを参照する必要があります。

私のDbContext

  public partial class SalesDbContext : DbContext, IUnitOfWork
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }

        public DbSet<Activity> Activities { get; set; }

        /// <summary>
        /// Allows saving changes via the IUnitOfWork interface.
        /// </summary>
        void IUnitOfWork.Commit()
        {
            base.SaveChanges();
        } 

私のIUnitOfWork

public interface IUnitOfWork
{
    /// <summary>
    /// Saves changes to all objects that have changed within the unit of work.
    /// </summary>
    void Commit();
}

私のRepository

public class Repository
{
    protected IUnitOfWork UnitOfWork { get; set; }

    protected SalesDbContext Context
    {
        get { return (SalesDbContext)this.UnitOfWork; }
    }

    public Repository(IUnitOfWork unitOfWork)
    {
        if (unitOfWork == null) throw new ArgumentNullException("unitOfWork");
        this.UnitOfWork = unitOfWork;
    }

    private DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class
    {
        return this.Context.Set<TEntity>();
    }

    protected IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
    {
        return this.GetDbSet<TEntity>()
            .AsEnumerable();
    }

    protected virtual void SetEntityState(object entity, EntityState entityState)
    {
        this.Context.Entry(entity).State = entityState;
    }
}

そして最後に私のNinject設定

private static void RegisterServices(IKernel kernel)
{
    IUnitOfWork unitOfWork = new SalesDbContext();

    kernel.Bind<IUnitOfWork>().ToConstant(unitOfWork);
    kernel.Bind<IMarketService>().To<MarketService>();
} 

問題は、NinjectがEntity Frameworkへの参照を必要としていることですが、ここに追加したくありません。データレイヤーに属しています。

そして、DbContextのToConstant実装が問題を引き起こすと思いますか?

4

1 に答える 1

1

最上位 (Web など) プロジェクトから EntityFramework を参照したくない場合、どのようにアプリケーションを構築しますか? 最上位プロジェクトには、基になるすべての依存関係への参照が必要なため、web app の場合はフォルダー内に配置できbinます。

そして間違いなく、その参照を必要としているのは Ninject ではありません。そのプロジェクトの EntityFramework に依存するクラスを使用しているためです。

最上層から(中間を介して)最下層への参照があっても問題ありません。逆の場合(たとえば、データレイヤーから への参照がある場合)は、(設計)問題である可能性がありますSystem.Web

アップデート

OPが彼のコメントで述べたように。ninject.extensions.xmlを使用して、最上位層から最下位層 (EF など) の依存関係を参照しないようにするための解決策が 1 つあります。意図が最上位層プロジェクトで ninject 構成を作成することであった場合にのみ機能しますが、プロジェクト自体は依存関係のある最下層クラスを参照 (使用) していません。また、EF は GAC にある必要があります。


DbContext ToConstant()を実装している限り、あなたをバインドするのは良い考えではありませんIDisposable。アプリケーション (例: Web アプリ) にとって意味DbContextのある最短の形式でバインドする必要があります。Ninject は、 の最後でそれを破棄します。ScopeInRequestScope()Scope

DbContextboundを許可ToConstantすると、アプリケーションのライフサイクル全体でデータベースへの接続が 1 つ保持されます。DbContext複数のスレッドからアクセスすると、オブジェクトの同期を維持できなくなるため、同時実行の問題が発生し、一貫性が失われる可能性があります。

于 2013-02-06T01:06:43.487 に答える