我有一个.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。
感谢您的帮助。
答案 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