我在vs2015 rc中使用mvc6。阅读Using IConfiguration globally in mvc6后,我的代码现在看起来像这样:
startup.cs:
private Settings options;
public MyController(IOptions<Settings> config)
{
options = config.Options;
}
我的控制员:
<input type="checkbox" required="" value="1" ng-click="selectType(1, $event)">
这对控制器很有用。
但是如何从代码中的其他位置访问我的Settings对象,例如从我的Formatters内部(实现IInputFormatter,因此使用固定签名)或任何其他随机类?
答案 0 :(得分:3)
一般来说,只要您有HttpContext
的访问权限,就可以使用名为RequestServices
的属性来访问DI中的服务。例如,要从ObjectResult
内访问ILogger
服务。
public override async Task ExecuteResultAsync(ActionContext context)
{
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ObjectResult>>();
以上用法与您在上面的控制器示例中提到的有点不同,因为MVC中的控制器是type activated
...构建控制器的责任是通过DI管理,它将查看参数构造函数和从DI中的注册服务填充它们...这也称为constructor injection
...
要了解DI类型激活如何工作(DI独立于MVC并且甚至可以在控制台应用中使用),请查看以下代码片段(取自http://docs.asp.net/en/latest/security/data-protection/using-data-protection.html)
using System;
using Microsoft.AspNet.DataProtection;
using Microsoft.Framework.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection();
var services = serviceCollection.BuildServiceProvider();
// create an instance of MyClass using the service provider
var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
instance.RunSample();
}
public class MyClass
{
IDataProtector _protector;
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
public void RunSample()
{
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
}
}
}
在上面的示例中,类型MyClass
已激活类型。
关于InputFormatter
的具体示例,它们未类型已激活,因此您无法使用构造函数注入,但您可以访问HttpContext
和所以你可以像本文前面提到的那样做。
另请参阅此文章:http://blogs.msdn.com/b/webdev/archive/2014/06/17/dependency-injection-in-asp-net-vnext.aspx