你应该使用命名和密钥服务 http://docs.autofac.org/en/latest/advanced/keyed-services.html
builder.RegisterType<DatabaseA_Context>()
.Named<DbContext>("databaseA")
.InstancePerLifetimeScope();
builder.RegisterType<DatabaseB_Context>()
.Named<DbContext>("databaseB")
.InstancePerLifetimeScope();
然后您可以在注册时为组件指定所需的 DbContext
builder.RegisterType<MyService>()
.As<IService>()
.WithParameter((pi, c) => pi.Name == "dbContext",
(pi, c) => c.ResolveNamed<DbContext>("databaseA"))
或者通过使用IIndex<,>
public class MyService : IService
{
public MyService(IIndex<String, DbContext> dbContexts)
{
var databaseA = dbContexts["databaseA"];
}
}
Autofac还支持指定命名注册WithKeyAttribute
public class MyService : IService
{
public MyService([WithKey("DatabaseA")DbContext dbContext)
{
}
}
请参阅元数据文档 http://docs.autofac.org/en/latest/advanced/metadata.html有关如何获取的更多信息WithKeyAttribute
set up.
有了这个解决方案,DbContext
不会被注册。如果你想要默认值DbContext
你可以像这样注册一个:
builder.Register(c => c.ResolveNamed<DbContext>("databaseA"))
.As<DbContext>()
.InstancePerLifetimeScope();
您还可以使用一个模块,该模块将根据参数名称选择正确的注册:
public class MyService : IService
{
public MyService(DbContext dbContextA, DbContext dbContextB)
{
}
}
为此,您需要注册此Autofac Module
public class DbContextModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += Registration_Preparing;
}
private void Registration_Preparing(Object sender, PreparingEventArgs e)
{
Parameter parameter = new ResolvedParameter(
(pi, c) => pi.ParameterType == typeof(DbContext),
(pi, c) =>
{
if (pi.Name.Equals("dbContextA", StringComparison.OrdinalIgnoreCase))
{
return c.ResolveNamed<DbContext>("databaseA");
}
else if (pi.Name.Equals("dbContextB", StringComparison.OrdinalIgnoreCase))
{
return c.ResolveNamed<DbContext>("databaseB");
}
else
{
throw new NotSupportedException($"DbContext not found for '{pi.Name}' parameter name");
}
});
e.Parameters = e.Parameters.Concat(new Parameter[] { parameter });
}
}
and
builder.RegisterModule<DbContextModule>()