首页 > 解决方案 > 构造函数中具有参数的 autfac 注入服务

问题描述

我了解如何使用autofac docs中的TypedParameter将可为空的参数注入构造函数。我正在努力了解如何将该服务注入另一个服务,该服务将来自该参数。这是一些示例代码:

// interface
pubic Interface IProvider 
{
    string GetParameter();
}

// implementation
public class Provider : IProvider
{
    private readonly int? _parameterId;
    public Provider(int? parameterId){
        _parameterId = parameterId;
    }
    public string GetParameter(){
         // go get my parameter from wherever using int that was passed to constructor
    }
}

现在在我的 api 控制器中,我可能会注入这个服务,这样我就可以获得一个参数:

public class ParameterController : ApiController
{
    private readonly IProvider _provider;
    public ParameterController(IProvider provider){
         _provider = provider;
    }
    [HttpGet]
    public string GetParameterNoInput(){
         _provider.GetParameter(null);
    }
    [HttpGet]
    public string GetParameter(int input){
        // my provider wants this input but not as a passed parameter
        // I don't know how to do this
    }
 }

当然还有注册

builder.RegisterType<Provider>().As<IProvider>().InstancePerRequest()
   .WithParameter(new TypedParameter(typeof(Guid?), "parameterId"));

FWIW,我知道这不是一个很好的设计选择,但这是对我的要求。在 autofac 中处理这个问题的模式是什么?为了澄清,正在规定的部分是 IProvider 具有可空的 int parameterId 注入它,而不是具有接受 int 的公开方法

我应该在我的控制器中做这样的事情吗:

Func<int?>, IProvider _newProvider;
public ParameterController(Func<int?, IProvider> provider){
    _newProvider = provider;
}

// and then in my api i can do
[HttpGet]
public string GetParameter(int input){
    var provider = _newProvider(input);
    provider.GetParameter();
}

标签: c#dependency-injectionautofac

解决方案


Autofac 允许您在注册服务时传递参数。在你的情况下,这看起来像这样

builder.Register(c => new Provider(someInt)).As<IProvider>().InstancePerRequest();

假设 Provider 的所有实例都需要传入相同的参数。

更多信息和其他配置方法可以在Autofac Docs中找到


推荐阅读