c# – Autofac – 动态解析带参数的组件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Autofac – 动态解析带参数的组件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1931字,纯文字阅读大概需要3分钟。
内容图文
![c# – Autofac – 动态解析带参数的组件](/upload/InfoBanner/zyjiaocheng/825/a78a1d9f240548dc89dcd700e60e5789.jpg)
我有一个类接口作为构造函数参数.这个接口有两个实现,我想根据变量决定在运行时使用什么实现.
问题是上面的类是深入一个由Autofac解决的对象层次结构,因此我无法传入参数.
像下面这样的Somehing就是我想要实现的目标.
public interface IInterface1 {}
public interface IInterface2 {}
public class Class1 : IInterface2
{
public Class1(IInterface1 interface1)
{
}
}
public class Class2
{
public Class2(IInterface2 interface2)
{
}
}
public class Class3
{
public void GetClass2Instance(string interface1ImplementationToChoose)
{
// want to change which implementation of IInterface1 is resolved based on the interface1ImplementationToChoose variable
var class2 = container.Resolve<Class2>();
}
}
有任何想法吗?
更新:
为了澄清,这是一个现有的对象层次结构,现有的应用程序使用它可以正常工作.此外,对象模型比此示例中显示的大得多.因此,我真的不想将工厂传递给对象图中的每个构造函数,以供该图中深层的类使用.
有没有办法让IInterface1的不同实现传递到Class1而没有Class2知道它的任何内容?
谢谢
解决方法:
是的,注入一个隐藏如何选择类型的工厂:
public class Class3
{
private Func<string, Class2> _class2Factory;
public Class3(Func<string, Class2> class2Factory)
{
_class2Factory = class2Factory;
}
public void GetClass2Instance(string interface1ImplementationToChoose)
{
var class2 = _class2Factory(interface1ImplementationToChoose);
}
}
然后是容器设置,这些内容如下:
builder.RegisterType<Implementation1>().Named("imp1").As<IInterface1>();
builder.RegisterType<Implementation2>().Named("imp2").As<IInterface1>();
builder.Register<Func<string, Class2>>(c =>
{
var context = c.Resolve<IComponentContext>();
return imp => new Class2(context.Resolve<IInterface1>(imp));
});
builder.RegisterType<Class3>();
您现在可以像这样使用Class3:
public class Class4
{
public Class4(Class3 class3)
{
var class2with1 = class3.GetClass2Instance("imp1");
var class2with2 = class3.GetClass2Instance("imp2");
}
}
注意:我假设您的意思是Class2应该注入相同接口IInterface1的不同实现.您的示例有点令人困惑,因为您显示了两个实现不同接口的类.
内容总结
以上是互联网集市为您收集整理的c# – Autofac – 动态解析带参数的组件全部内容,希望文章能够帮你解决c# – Autofac – 动态解析带参数的组件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。