给定以下配置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。当然,有一种更简单,更清洁,更整洁的方式吗?
1 回答
白衣非少年
TA贡献1155条经验 获得超0个赞
给定该值是原始值并且它来自config,建议的解决方案实际上是使用提供程序类型的接口。具有原始构造函数参数(字符串,整数等)存在很多问题,主要问题之一是它们是如此原始,以至于无法从类型角度区分每个目标的目的。是。在容器中为需要连接字符串的一个类注册一个字符串,而其他一些类可能出于某种不相关的目的而无意中获取了它。
您描述的示例实际上就是我们在该主题上的常见问题解答。如果您不能/不会使用lambda(这是您正在寻找的更简单/更整洁/更干净的方式),那么提供程序界面是下一个最佳选择。
请注意,如果要使用lambda,则不必更改控制器。
// Register everything nicely
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Override just the one controller
builder.Register(ctx => new MyController(123)).As<MyController>();
最后取胜,所以当Web API尝试解析时,MyController它将从lambda获得注册。
- 1 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消