在MVC 6中访问依赖注入服务

时间:2015-05-07 10:38:47

标签: configuration asp.net-core asp.net-core-mvc

我在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,因此使用固定签名)或任何其他随机类?

1 个答案:

答案 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