C# 获取通过Autofac模块注册的对象的多个实例
我有一个用例,我需要从Autofac模块获得两个注册对象的副本,并将它们传递给注册不同类型的对象 在下面的代码示例中C# 获取通过Autofac模块注册的对象的多个实例,c#,dependency-injection,autofac,ioc-container,C#,Dependency Injection,Autofac,Ioc Container,我有一个用例,我需要从Autofac模块获得两个注册对象的副本,并将它们传递给注册不同类型的对象 在下面的代码示例中 我想用configdbConfig传递DataProtectionService的对象以注册MyDbRepo 类似地,我想通过configcacheConfig传递DataProtectionService的对象来注册MyCacheRepo 但是,我不知道我该怎么做?我是不是错过了一些基本的东西 我没有删除此数据保护服务模块的选项。有没有办法达到我的期望 公共类DataProte
dbConfig
传递DataProtectionService的对象以注册MyDbRepo
cacheConfig
传递DataProtectionService的对象来注册MyCacheRepo
数据保护服务模块的选项。有没有办法达到我的期望
公共类DataProtectionService模块:模块
{
私有只读字符串配置;
公共数据保护服务模块(字符串配置)
{
this.config=config;
}
受保护的覆盖无效负载(ContainerBuilder builder)
{
builder.Register(compContext=>
{//这里有一个复杂的逻辑
}).OnRelease(instance=>instance.Dispose());
builder.Register(c=>
{
//生成IDataProtectionService对象的逻辑
//此逻辑涉及使用此类的配置字段。
}).As();
}
}
公共类MyDbRepo:IMyDbRepo
{
IDataProtectionService数据保护服务;
公共MyDbRepo(IDataProtectionService数据保护服务)
{
this.dataProtectionService=dataProtectionService;
}
}
公共类MyCacheRepo:IMyCacheRepo
{
IDataProtectionService数据保护服务;
公共MyCacheRepo(IDataProtectionService数据保护服务)
{
this.dataProtectionService=dataProtectionService;
}
}
//我的后端微服务的Program.cs
var builder=new ContainerBuilder();
RegisterModule(新的DataProtectionServiceModule(“dbConfig”);
builder.RegisterModule(新的DataProtectionServiceModule(“cacheConfig”);//我想,这是错误的。
builder.RegisterType().As().SingleInstance();
builder.RegisterType().As().SingleInstance();
您可以使用。然后在您的注册中添加一个特定的Resolve
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// Program.cs of my backend micro service
var builder = new ContainerBuilder();
builder.RegisterModule(new DataProtectionServiceModule("dbConfig", DeviceState.Db));
builder.RegisterModule(new DataProtectionServiceModule("cacheConfig", DeviceState.Cache)); // I have figured, this is wrong.
builder.RegisterType<MyDbRepo>().WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(IDataProtectionService),
(pi, ctx) => ctx.ResolveKeyed<IDataProtectionService>(DeviceState.Db)
)
).As<IMyDbRepo>().SingleInstance();
builder.RegisterType<MyCacheRepo>().WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(IDataProtectionService),
(pi, ctx) => ctx.ResolveKeyed<IDataProtectionService>(DeviceState.Cache)
)
).As<IMyCacheRepo>().SingleInstance();
var container = builder.Build();
var cache = container.Resolve<IMyCacheRepo>();
var db = container.Resolve<IMyDbRepo>();
}
}
public enum DeviceState { Cache, Db }
public class DataProtectionServiceModule : Module
{
private readonly string config;
private readonly DeviceState _state;
public DataProtectionServiceModule(string config, DeviceState state)
{
this.config = config;
_state = state;
}
protected override void Load(ContainerBuilder builder)
{
builder.Register<Token>(compContext =>
{ // a complex logic here
}).OnRelease(instance => instance.Dispose());
builder.Register(c =>
{
// a logic to generate an object of IDataProtectionService
// this logic involves the use of config field of this class.
return new DataProtectionService(config);
}).Keyed<IDataProtectionService>(_state);
}
}
public class DataProtectionService : IDataProtectionService
{
public string Config { get; }
public DataProtectionService(string config)
{
Config = config;
}
}
public class MyDbRepo : IMyDbRepo
{
IDataProtectionService dataProtectionService;
public MyDbRepo(IDataProtectionService dataProtectionService)
{
this.dataProtectionService = dataProtectionService;
}
}
public interface IDataProtectionService
{
}
public interface IMyDbRepo
{
}
public class MyCacheRepo : IMyCacheRepo
{
IDataProtectionService dataProtectionService;
public MyCacheRepo(IDataProtectionService dataProtectionService)
{
this.dataProtectionService = dataProtectionService;
}
}
public interface IMyCacheRepo
{
}
以及您的模块:
protected override void Load(ContainerBuilder builder)
{
//builder.Register<Token>(compContext =>
//{ // a complex logic here
//}).OnRelease(instance => instance.Dispose());
builder.Register(c =>
{
// a logic to generate an object of IDataProtectionService
// this logic involves the use of config field of this class.
return new DataProtectionService(config);
}).Named<IDataProtectionService>(config);
}
protected override void Load(ContainerBuilder生成器)
{
//builder.Register(compContext=>
//{//这里有一个复杂的逻辑
//}).OnRelease(instance=>instance.Dispose());
builder.Register(c=>
{
//生成IDataProtectionService对象的逻辑
//此逻辑涉及使用此类的配置字段。
返回新的DataProtectionService(配置);
}).命名(配置);
}
如果我通过serviceCollection将IDataProtectionService的依赖项注入到构建器中,它也会起作用吗:cs builder.Register(c=>{serviceCollection serviceCollection=new serviceCollection();serviceCollection.AddDataProtection()//由asp.net ServiceProvider提供ServiceProvider=serviceCollection.BuildServiceProvider();var dataProtectionProvider=ServiceProvider.GetDataProtectionProvider();return dataProtectionProvider;})。命名(this.config)代码>对不起,上面的代码没有插入。看不到任何立即在注释中插入具有适当缩进的代码的方法。因此,是否要使用Microsoft.DI
解析实例,然后向Autofac注册该实例?我不明白为什么不应该这样做,只要实例提供给Autofac。
protected override void Load(ContainerBuilder builder)
{
//builder.Register<Token>(compContext =>
//{ // a complex logic here
//}).OnRelease(instance => instance.Dispose());
builder.Register(c =>
{
// a logic to generate an object of IDataProtectionService
// this logic involves the use of config field of this class.
return new DataProtectionService(config);
}).Named<IDataProtectionService>(config);
}