WebAPI-具有DbContext对象创建的存储库类

时间:2018-08-17 10:37:44

标签: entity-framework asp.net-web-api asp.net-web-api2 repository-pattern

我是ASP.NET WebAPI项目的新手,并使用以下结构构建新项目:-

Project.MainAPIService
Project.BusinessManager
Project.Model
Project.Repository
Project.Common

我正在使用Autofac在整个项目中执行DI。流程是这样的:-

API controller   >>>>>> (DI) Business Manager >>>> (DI) Repository & creates the DBContext object manually.

我的Repository类看起来像这样。现在,我想将客户端名称动态传递到Repository类中,以使其仅与特定的客户端数据库建立数据库连接。但是我无法将客户端名称从businessManager项目传递到PDLRepository,然后再传递给DBContext类。

public class MyRepository : IMyRepository, IDisposable
    {
        myContext _context = new myContext("ClientX");

        private IGenericRepository<Mapping> _docMappingGenericRepo;
        private IGenericRepository<Document> _DocGenericRepo;
        private IGenericRepository<Activity> _activityGenericRepo;
    }

mycontext类如下所示:-

 public partial class mycontext : DbContext
    {
        public mycontext (string ClientName)
            : base(ConnectionUtil.GetConnectionString(ClientName))
        { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer<myContext>(null);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }

        public virtual DbSet<DocumentMapping> DocumentMapping { get; set; }

        public virtual DbSet<Document> Document { get; set; }
   }

请提出您的意见,以相应地修复myContext或MyRepository类。如何将客户端名称从BusinessManager传递到存储库,再传递给DBContext类?

请在这里帮助我。

1 个答案:

答案 0 :(得分:0)

请勿在存储库中创建myContext。从存储库中删除以下行。

myContext _context = new myContext("ClientX");

相反,请在myContext中创建和管理BusinessManager。由于BusinessManager已经知道ClientName,因此可以在这里创建它,而不会出现与我们从存储库中删除的相同行的麻烦。

现在,将myContext注入存储库中。

您显然有多个数据库;每个客户一个。因此,一个数据库代表一个客户端。 Connection表示数据库,myContext正在处理Connection。因此,我上面提到的方法更有意义。

存储库执行操作,它不应控制Connection。使用这种方法,您还可以在一个myContext中包含多个存储库,这将帮助您在一个事务/ UoW下覆盖所有这些存储库。

This答案说明了如何使用Dapper进行此操作。技术可能与您无关。但是其他细节可能会对您有所帮助。