Autofac.使用带params的构造函数注册类

本文关键字:构造函数 注册 params Autofac | 更新日期: 2023-09-27 18:00:25

我有一个自定义类:

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

有什么想法吗?Thx。

Autofac.使用带params的构造函数注册类

在注册中能够做到这一点的唯一方法是向上导航堆栈跟踪到原始调用站点,然后检查进行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);

使意图更加明确。