来自类的IOptionsSnapshot依赖注入

时间:2018-01-19 14:34:19

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0

我有一个.net core 2.0应用程序,它有一个appsettings.json文件,用于保存服务的配置。

在我的启动脚本中,我添加了以下代码:

services.Configure<AppConfiguration>(Configuration.GetSection("AppConfiguration"));

现在绑定的设置。我可以从任何控制器访问配置,例如:

    public class HomeController : Controller
    {
        private AppConfiguration _mySettings;

        /// <summary>
        /// Constructor binds the AppConfiguration
        /// </summary>
        /// <param name="settings"></param>
        public HomeController(IOptionsSnapshot<AppConfiguration> settings)
        {
            _mySettings = settings.Value;
            this.IsOnline = _mySettings.MQTTSettings.Active && _mySettings.MicroserviceID != 0;
        }
    }

现在有我的问题。我还想使用普通类中的IOptionsSnapshot,它们不会扩展抽象的Controller类。例如:

public class TestClass
{
    public TestClass(IOptionsSnapshot<AppConfiguration> optionsSnapshot)
    {
           //DO SOME STUFF WITH THE Snapshot
    }
}

问题是,当我尝试从中创建一个对象时,我必须将IOptionsSnapshot传递给Testclass。

TestClass t = new TestClass(NEEDS AN IOptionsSnapsot Object);

那么我怎样才能获得IOptionsSnapshot,还是有其他可能性将它放入TestClass?在这种情况下我怎么能访问它?

例如,在启动例程中我以前没有任何控制器调用,所以我需要在类中首先使用IOptionsSnapshot。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您不应该使用new手动创建服务类。关于依赖注入的观点是 not 有责任创建类型,因此将正确的依赖项传递给它。相反,您应该询问以获取您的类型的实例,并让依赖容器为您解析依赖关系。

因此,无论您在哪里尝试new TestClass,都应该注入一个TestClass实例。这需要您在服务集合中注册TestClass,这也要求您通过依赖注入解析TestClass的消费者 。基本上,所有不是数据类的东西都应该通过依赖注入来解决。

例如,在您的Startup的{​​{1}}方法中,您希望将ConfigureServices注册为服务:

TestClass

然后,在你的控制器中,你可能想要使用services.AddTransient<TestClass>(); ,所以你注入它:

TestClass

并且因为public class HomeController : Controller { private readonly TestClass _testClass; public HomeController(TestClass testClass) { _testClass = testClass; } public IActionResult Index() { var data = _testClass.DoSomething(); return View(data); } } 是通过依赖注入解决的,所以它也可以具有自动解决的依赖关系:

TestClass