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);