形势ASP.NET MVC多租户使用Autofac和Owin
分离式数据库,我们必须与SQL Server一起运行一个ASP.NET MVC应用5。我们有一个主数据库,其中包含一个表Tenants
,我们所有的租户都使用连接字符串属性注册到他们自己的个人数据库。
对于认证,我们使用Microsoft Owin
库。
Autofac
我们已经建立autofac这样的:
var builder = new ContainerBuilder();
// Register the controllers
builder.RegisterControllers(typeof(Project.Web.ProjectApplication).Assembly);
// ### Register all persistence objects
// Project main database registration (Peta Poco instance using connectionstring as parameter)
builder.RegisterType<ProjectDatabase>()
.As<ProjectDatabase>()
.WithParameter(new NamedParameter("connectionString", GlobalSettings.ProjectTenantConnectionString))
.InstancePerLifetimeScope();
// Project tenant specific database registration
// ...
// Unit of work
builder.RegisterType<PetaPocoUnitOfWork>()
.As<IDatabaseUnitOfWork>()
.InstancePerRequest();
// ### Register all services
builder.RegisterAssemblyTypes(Assembly.Load("Project.Core"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
// ### Register all repositories
builder.RegisterType<RepositoryFactory>()
.As<IRepositoryFactory>()
.InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(Assembly.Load("Project.Core"))
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
// Register Logging
builder.RegisterType<Logger>().As<ILogger>().InstancePerLifetimeScope();
// Register Automapper
builder.RegisterAssemblyTypes(Assembly.Load("Project.Core")).As<Profile>();
builder.RegisterAssemblyTypes(Assembly.Load("Project.Web")).As<Profile>();
builder.Register(context => new MapperConfiguration(cfg =>
{
foreach (var profile in context.Resolve<IEnumerable<Profile>>())
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
.As<AutoMapper.IMapper>()
.InstancePerLifetimeScope();
// Register Owin
builder.Register(ctx => HttpContext.Current.GetOwinContext()).As<IOwinContext>();
builder.Register(
c => new IdentityUserStore(c.Resolve<IUserService>()))
.AsImplementedInterfaces().InstancePerRequest();
builder.Register(
ctx => ctx.Resolve<IOwinContext>().Authentication)
.As<IAuthenticationManager>().InstancePerRequest();
builder.RegisterType<IdentityUserManager>().AsSelf().InstancePerRequest();
// Build container
var container = builder.Build();
// Tenant container
var tenantIdentifier = new RequestSubdomainStrategy();
var mtc = new MultitenantContainer(tenantIdentifier, container);
// Set autofac as dependency resolver
DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));
更多细节
使用这个设置中,我们有Autofac一个实例安装到我们的主Tenant
数据库。 然后将其注入我们的PetaPocoUnitOfWork
以进行交易。
这有效,我可以得到租户信息。
但是现在我们需要以下工作,我们不知道从哪里开始。
- 我们如何设置autofac注册租户地图POCO数据库实例注入
PetaPocoUnitOfWork
,以及如何将应用程序现在该怎么解决这个问题?因为我们需要访问2个数据库(主数据库和个人租户数据库),首先需要获取租户连接字符串,然后再对租户数据库执行crud操作。 - 我们的
PetaPocoUnitOfWork
包含数据库的工作方式,我们是否应该为每个租户注册,并使用autofac的解析方法传递数据库,并在每个请求的实例上设置它?
很高兴地看到,已经3 SO用户要关闭这个问题...如果它能够广泛我应该将它们放置在分离式问题,并在一起或链接...? – Mivaweb