C# 自动传真机。使用参数向构造函数注册类
我有一个自定义类:C# 自动传真机。使用参数向构造函数注册类,c#,autofac,C#,Autofac,我有一个自定义类: public class MyClass: IMyClass{ public MyClass(String resolverNamespace){ //Do some stuff dependent on resolverNamespace } //... Other stuff } public interface IMyClass{ //... Other stuff } 我需要在我的autofac容器中注册它,以允许解析实
public class MyClass: IMyClass{
public MyClass(String resolverNamespace){
//Do some stuff dependent on resolverNamespace
}
//... Other stuff
}
public interface IMyClass{
//... Other stuff
}
我需要在我的autofac容器中注册它,以允许解析实例依赖于调用方的命名空间。
这就是我所期望的:
//Registering in autofac
builder.Register(x=>new MyClass(x.ResolveCallerNamespace)).As(IMyClass);
// Somewhere in application
namespace SomeNamespace{
public SomeClass{
public void SomeMethod(){
{
// Here i need to resolve MyClass instance(calling new MyClass("SomeNamespace"))
var instance = container.Resolve<IMyClass>();
}
}
}
//在autofac中注册
Register(x=>newmyclass(x.ResolveCallerNamespace)).As(IMyClass);
//应用中的某处
名称空间名称空间{
公共课{
公共方法(){
{
//这里我需要解析MyClass实例(调用新的MyClass(“SomeNamespace”))
var instance=container.Resolve();
}
}
}
有什么想法吗?Thx.在注册中实现这一点的唯一方法是,向上导航堆栈跟踪到原始调用站点,然后检查执行
解析
调用的类的命名空间。如果此对象不经常构造,则这可能是可以接受的。但是,如果该对象是l我经常被构造,然后你需要另一种方法
此外,您还应该知道,这种方法是脆弱的,因为您无法保证调用方将如何解析实例
我认为在Autofac
中执行此操作的正确方法就是将名称空间作为构造函数参数传递:
builder.RegisterType<MyClass>().As<IMyClass>();
public SomeClass
{
public void SomeMethod()
{
var factory = container.Resolve<Func<string, IMyClass>>();
var instance = factory(this.GetType().Namespace);
}
}
然后:
var factory=container.Resolve();
var实例=工厂(此);
使意图更加明确。如果您必须手动解决它,这是一个很好的方法。如果您有构造函数参数或属性需要注入
IMyClass
,请查看Autofac wiki,了解我们如何以更自动化的方式为log4net
记录器执行类似操作的示例:谢谢大家。它帮助了我了解工厂,但我不确定这是否是解决此类问题的最佳做法。
public class MyClass
{
public MyClass(object namespaceProvider)
: this (namespaceProvider.GetType().Namespace)
{ }
}
var factory = container.Resolve<Func<object, IMyClass>>();
var instance = factory(this);