Autofac。使用带参数的构造函数注册类

时间:2014-04-28 09:21:47

标签: c# autofac

我有类自定义类:

public class MyClass: IMyClass{
    public MyClass(String resolverNamespace){
       //Do some stuff dependent on resolverNamespace
    }
    //... Other stuff
}

public interface IMyClass{
   //... Other stuff
}

我需要在autofac容器中注册它以允许resolve实例取决于调用者的命名空间。 多数民众赞成我的期望应该是:

 //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>();
      }
 }
 }

任何想法? THX。

1 个答案:

答案 0 :(得分:1)

您在注册中能够做到这一点的唯一方法是将堆栈跟踪导航到原始调用站点,然后检查进行Resolve调用的类的命名空间。如果这个对象不经常构建,那么这可能是可以接受的。但是,如果对象很可能经常构建,那么您需要另一种方法。

此外,您应该知道这种方法很脆弱,因为您无法保证调用者如何解析实例。

我认为在Autofac中执行此操作的正确方法是将命名空间作为构造函数参数传递:

builder.RegisterType<MyClass>().As<IMyClass>();

public SomeClass
{
    public void SomeMethod()
    {
         var factory = container.Resolve<Func<string, IMyClass>>();
         var instance = factory(this.GetType().Namespace);
    }
}

您可以进一步指定:

public class MyClass
{
   public MyClass(object namespaceProvider)
      : this (namespaceProvider.GetType().Namespace)
   { }
}

然后:

var factory = container.Resolve<Func<object, IMyClass>>();
var instance = factory(this);

使意图更明确。