为了账号安全,请及时绑定邮箱和手机立即绑定

使用AutoFac将原始值传递给ApiController的简单方法

使用AutoFac将原始值传递给ApiController的简单方法

C#
烙印99 2021-04-13 21:14:29
给定以下配置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获得注册。


查看完整回答
反对 回复 2021-04-17
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信