【发布时间】:2018-04-12 09:47:57
【问题描述】:
鉴于以下配置 Autofac 的方法:
public class DefaultConfigurationModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
}
}
并给出以下 Web-Api 控制器:
public class MyController : ApiController
{
private readonly int _someValue;
public MyController(int someValue)
{
_someValue = someValue;
}
}
将someValue 传递给MyController 的构造函数的最简单方法是什么?
我可以创建一个MyControllerConfig 类并将其注册到 AutoFac:
public interface IMyControllerConfig
{
int SomeValue { get; }
}
public class MyControllerConfig : IMyControllerConfig
{
public int SomeValue { get; set; }
public MyControllerConfig(int someValue)
{
SomeValue = someValue;
}
}
并将其添加到我的配置模块中:
builder.Register(c => new MyControllerConfig(123)).As<IMyControllerConfig>();
并更改MyApiController 以接受IMyControllerConfig 而不是int:
public class MyController : ApiController
{
private readonly int _someValue;
public MyController(IMyControllerConfig myControllerConfig)
{
_someValue = myControllerConfig.SomeValue;
}
}
IMyControllerConfig 接口可能有点矫枉过正;我可以不用MyControllerConfig 就完成了。但是无论哪种方式;整个MyControllerConfig 类似乎将单个(原始)值传递给我的 ApiController 有点过分了。 肯定有更简单、更干净、更整洁的方法吗?
如果这不是 ApiController,我会这样做:
builder.Register(c => new MyClass(123)).As<IMyInterface>();
...只需传入整数。但由于它是 WebApi 控制器,我想/喜欢使用 RegisterApiControllers 方法(因为有很多控制器可以/使用此方法注册就好了) 我似乎把自己画到了一个角落里。并更改MyController,使其不会通过RegisterApiControllers 方法获得'picked up'(例如,通过将其名称更改为不在'Controller' 上结束)并'手动'注册此控制器feels 也有点“脏”。
另一种方法是实现一个依赖解析器并在那里发挥作用,但同样,将单个原语传递给构造函数似乎需要做很多工作。我理解并同意,使用上述方法(使用MyControllerConfig 类)更适合未来的增强和传递更多值而没有太多麻烦,但我不需要它用于这个特定项目。项目中的所有其他 API 控制器都使用无参数构造函数或具有参数接口的构造函数。
请注意,以上示例中的123“const”实际上来自配置文件,只是为了简洁起见;如果它是一个常量,我不需要构造函数参数,可以直接将它放在MyController 类中。
【问题讨论】:
标签: c# dependency-injection asp.net-web-api2 owin autofac