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

给定以下配置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。当然,有一种更简单,更清洁,更整洁的方式吗?


烙印99
浏览 205回答 1
1回答

白衣非少年

给定该值是原始值并且它来自config,建议的解决方案实际上是使用提供程序类型的接口。具有原始构造函数参数(字符串,整数等)存在很多问题,主要问题之一是它们是如此原始,以至于无法从类型角度区分每个目标的目的。是。在容器中为需要连接字符串的一个类注册一个字符串,而其他一些类可能出于某种不相关的目的而无意中获取了它。您描述的示例实际上就是我们在该主题上的常见问题解答。如果您不能/不会使用lambda(这是您正在寻找的更简单/更整洁/更干净的方式),那么提供程序界面是下一个最佳选择。请注意,如果要使用lambda,则不必更改控制器。// Register everything nicelybuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());// Override just the one controllerbuilder.Register(ctx => new MyController(123)).As<MyController>();最后取胜,所以当Web API尝试解析时,MyController它将从lambda获得注册。
打开App,查看更多内容
随时随地看视频慕课网APP