c# - 构造函数中具有参数的 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();
}
解决方案
Autofac 允许您在注册服务时传递参数。在你的情况下,这看起来像这样
builder.Register(c => new Provider(someInt)).As<IProvider>().InstancePerRequest();
假设 Provider 的所有实例都需要传入相同的参数。
更多信息和其他配置方法可以在Autofac Docs中找到
推荐阅读
- php - 这两个数组有什么区别?
- c++ - 使用 C++ 的 AES-CBC 和 SHA-512 哈希加密产生奇数输出
- javascript - 为什么我的检测对象功能不起作用?
- react-native - React Native FlatList ListEmptyComponent 即使不为空也总是显示
- android-emulator - Android Emulator 未在 M1 上运行
- excel - 按为每个项目查找的属性计数项目
- java - Apache Kafka 生产者看不到代理
- php - 访问所有图像之外的文档根不工作 Apache windows
- javascript - 如何从 React 或 Javascript 中的对象属性中获取值
- reactjs - Redux 工具包:从切片文件导出自定义钩子以访问操作,而不是导出所有操作,然后通过调度再次调用它?