【发布时间】:2021-03-04 17:05:18
【问题描述】:
我一直在尝试使用 autofac 注册和注入两个相同类型的不同对象,但我无法成功注入第二个对象。注入的第二个对象总是在使用 SingleInstance() 时首先注册的类型 1 的同一个实例,或者在使用 InstancePerLifetimeScope 时是另一个类型 1 的实例。 InstancePerDependency 也不起作用。关于如何实现这一点的任何建议?谢谢!
发现了一个类似的未解决问题 - Inject multiple instances of same type - Autofac
/* Register named object of type1 */
builder.RegisterType<TestClient>()
.As<TestClient>()
.UsingConstructor(typeof(Settings), typeof(SampleEnum))
.WithParameters(new[]{
new ResolvedParameter((p, c) => p.ParameterType.IsAssignableTo<Settings>(), (p, c) => c.Resolve<Settings>()),
new ResolvedParameter((p, c) => p.ParameterType == typeof(SampleEnum) && p.Name == "eventtype",(p, c) => SampleEnum.Type1),
}).Named<TestClient>(clientoftype1).InstancePerDependency();
/* Register named object of type2 */
builder.RegisterType<TestClient>()
.As<TestClient>()
.UsingConstructor(typeof(Settings), typeof(SampleEnum))
.WithParameters(new[]{
new ResolvedParameter((p, c) => p.ParameterType.IsAssignableTo<Settings>(), (p, c) => c.Resolve<Settings>()),
new ResolvedParameter((p, c) => p.ParameterType == typeof(SampleEnum) && p.Name == "eventtype",(p, c) => SampleEnum.Type2),
}).Named<TestClient>(clientoftype2)).InstancePerDependency();
/*Controller registration
public DevController(TestClient clientoftype1, TestClient clientoftype2)
{..}
*/
builder
.RegisterType<DevController>()
.As<DevController>()
.WithParameters(new []{
ResolvedParameter.ForNamed<TestClient>("clientoftype1"),
ResolvedParameter.ForNamed<TestClient>("clientoftype2"),
} ).InstancePerRequest();
/*Check registered types*/
var types = container.ComponentRegistry.Registrations
.Where(r => typeof(TestClient).IsAssignableFrom(r.Activator.LimitType))
.Select(r => r.Activator.LimitType);
var countofobjects = types.ToList();//This has 2 objects.
【问题讨论】:
-
您能否详细说明您的期望是什么?我不清楚你的实际目标是什么。为什么需要两次注入相同的类型? minimal reproducible example 来说明问题会很好。
-
@Xerillio - 我想通过注入两个不同类型的 TestClient 对象来注册一个具有如下所示构造函数的控制器。在我的例子中,为这两个参数注入了创建的对象 clientoftype1。 public DevController(TestClient clientoftype1, TestClient clientoftype2)
-
这似乎是一个奇怪的要求。为什么需要两个相同类型的?也许你应该注入一个工厂并通过它创建两个对象?
-
感谢@Xerillio 的输入。我正在处理的项目有很多遗留代码,当然需要一些清理。
标签: c# asp.net-mvc autofac autofac-configuration