WebAPI - 包含 DbContext 对象创建的存储库 class
WebAPI - Repository class with DbContext object creation
我是 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.
我的存储库 class 看起来像这样。现在我想将客户端名称动态传递到存储库 class,以便它仅与特定客户端数据库建立数据库连接。但是我无法将客户端名称从 businessManager 项目传递到 PDLRepository 并进一步传递到 DBContext class。
public class MyRepository : IMyRepository, IDisposable
{
myContext _context = new myContext("ClientX");
private IGenericRepository<Mapping> _docMappingGenericRepo;
private IGenericRepository<Document> _DocGenericRepo;
private IGenericRepository<Activity> _activityGenericRepo;
}
mycontext class 看起来像这样:-
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 class。我如何将客户端名称从 BusinessManager 传递到 Repository 再到 DBContext class?
请帮帮我。
不要在存储库中创建 myContext
。从存储库中删除以下行。
myContext _context = new myContext("ClientX");
相反,在 BusinessManager
中创建和管理 myContext
。由于 BusinessManager
已经知道 ClientName
,可以使用我们从存储库中删除的同一行毫无问题地在那里创建它。
现在,将 myContext
注入存储库。
你显然有多个数据库;每个客户一个。所以一个数据库代表一个客户。连接代表数据库,myContext
正在处理连接。所以,我上面提到的方法更有意义。
Repository 执行动作,它不应该控制Connection。使用这种方法,您还可以在一个 myContext
中包含多个存储库,这将帮助您在一个 transaction/UoW.
下覆盖所有这些存储库
This 回答解释了如何使用 Dapper 执行此操作。技术可能与您无关;但其他细节可能对您有所帮助。
我是 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.
我的存储库 class 看起来像这样。现在我想将客户端名称动态传递到存储库 class,以便它仅与特定客户端数据库建立数据库连接。但是我无法将客户端名称从 businessManager 项目传递到 PDLRepository 并进一步传递到 DBContext class。
public class MyRepository : IMyRepository, IDisposable
{
myContext _context = new myContext("ClientX");
private IGenericRepository<Mapping> _docMappingGenericRepo;
private IGenericRepository<Document> _DocGenericRepo;
private IGenericRepository<Activity> _activityGenericRepo;
}
mycontext class 看起来像这样:-
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 class。我如何将客户端名称从 BusinessManager 传递到 Repository 再到 DBContext class?
请帮帮我。
不要在存储库中创建 myContext
。从存储库中删除以下行。
myContext _context = new myContext("ClientX");
相反,在 BusinessManager
中创建和管理 myContext
。由于 BusinessManager
已经知道 ClientName
,可以使用我们从存储库中删除的同一行毫无问题地在那里创建它。
现在,将 myContext
注入存储库。
你显然有多个数据库;每个客户一个。所以一个数据库代表一个客户。连接代表数据库,myContext
正在处理连接。所以,我上面提到的方法更有意义。
Repository 执行动作,它不应该控制Connection。使用这种方法,您还可以在一个 myContext
中包含多个存储库,这将帮助您在一个 transaction/UoW.
This 回答解释了如何使用 Dapper 执行此操作。技术可能与您无关;但其他细节可能对您有所帮助。