我正在构建一个多租户(每个租户数据库)应用程序。
结构图配置:
var connectionString = ConfigurationManager.ConnectionStrings["AccessControlDB"].ToString();
ObjectFactory.Initialize(x =>
{
x.For<IAccessControlContext>().Use<AccessControlContext>().Ctor<string>("connectionString").Is(connectionString);
x.For<IGenericRepository<Identities>>().Use<GenericRepository<IAccessControlContext, Identities>>();
x.Scan(scan =>
{
scan.AssembliesFromApplicationBaseDirectory();
scan.ExcludeNamespace("StructureMap");
scan.WithDefaultConventions();
});
});
已经出现了通过数据库隔离每个租户的新要求,因此使用tenantID已经不够了。
我已经拥有了一个元数据库来存储构建连接字符串所需的数据,但我对如何将连接字符串传递给存储库感到茫然。
首先,我认为我可以将连接字符串公开为属性,但是在上下文已经被structuremap实例化之后,无法更改连接字符串。
答案 0 :(得分:2)
不要将连接字符串传递给存储库,而是执行以下操作:
IContextFactory
注入存储库。此上下文工厂可以创建新的DbContext
实例。ITenantProvider
注入连接工厂。将上下文工厂注入存储库具有以下优点:
string
值带来的歧义,这可以防止您必须将连接字符串注入到许多类中。ITenantProvider
实现获得的租户信息)。 DbContext
实例而不是返回连接字符串,可以隐藏DbContext
的创建。这使您的存储库更容易,并且以后更容易更改它。请注意,我只是在猜测您的存储库是如何工作的,因此使用IContextFactory
可能不是最佳选择。但是通过防止直接注入连接字符串并将其隐藏在抽象之后(甚至比返回连接字符串更多),您可以使DI配置和应用程序代码更加容易,并且维护和测试。