繁体   English   中英

如何运行在.net Core中使用依赖注入的非静态代码

[英]How to run non-static code that uses dependency injection in .net core

我在VS2017中创建了一个新的控制台应用程序,并且试图运行此代码以演示我可以在.NET Core中加密和解密字符串。 我尝试从Program.cs Main调用RunSample,但它希望它是一个静态方法。 如果我将RunSample设为静态,则在尝试设置var protectedpayload时会收到null引用异常。

using System;
using Microsoft.AspNetCore.DataProtection;

public class MyClass
{
    private readonly IDataProtector _protector;

    public MyClass(IDataProtectionProvider provider)
    {
        _protector = provider.CreateProtector("Contoso.MyClass.v1");
    }

    public void RunSample()
    {
        Console.WriteLine("Enter input:");
        string input = Console.ReadLine();

        var protectedPayLoad = _protector.Protect(input);
        Console.WriteLine($"Protect returned: {protectedPayLoad}");

        var unprotectedPayLoad = _protector.Unprotect(protectedPayLoad);
        Console.WriteLine($"Unprotect returned: {unprotectedPayLoad}");
    }
}

我该如何运行?

更新:试图从Program.cs运行它,我有以下内容,但是.MyClass有一个“无法解析”语法错误/红色下划线。

using System;

namespace encrypttest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            new Program().MyClass.RunSample();
        }
    }
}

更新2:

我通过转到新项目.NET Core和控制台应用程序(.NET Core)创建了我的应用程序: 在此处输入图片说明

更新3:我已按照建议更改了代码,但出现以下错误: 在此处输入图片说明

更新4:我已经按照建议删除了using,但是现在我得到了: 在此处输入图片说明

您需要在Program.cs中直接输入IDataProtector

class Program
{
    static void Main(string[] args)
    {
        ServiceCollection services = new ServiceCollection();

        services.AddScoped<IDataProtector>();
        services.AddScoped<MyClass>();

        using (var serviceProvider = services.BuildServiceProvider())
        {
            var service = serviceProvider.GetService<MyClass>();
            service.RunSample();
        }
    }
}

更新-1:

从NuGet安装

Install-Package Microsoft.Extensions.DependencyInjection

更新-2:

像这样删除使用

var serviceProvider = services.BuildServiceProvider()
var service = serviceProvider.GetService<MyClass>();
service.RunSample();

更新-3:

我的代码是DI示例...您需要像这样的更改

ServiceCollection services = new ServiceCollection();

services.AddDataProtection();
services.AddScoped<MyClass>();

var serviceProvider = services.BuildServiceProvider();
var service = serviceProvider.GetService<MyClass>();
service.RunSample();

从NuGet安装

Install-Package Microsoft.AspNetCore.DataProtection

有关使RunSamples静态化的抱怨是因为您没有更新定义它的类。 如果不是实例,则该方法必须是静态的才能访问它。 但是,由于类(和方法)具有需要满足的依赖关系,因此无法使其成为静态。 简单来说,您需要使用依赖注入来创建您的类并满足其依赖关系的实例,以便调用RunSamples方法。

要在控制台应用程序中使用依赖项注入,就像添加Microsoft.Extensions.DependencyInjection NuGet包一样简单,然后:

var services = new ServiceCollection()
    .BuildServiceProvider();

但是,这并不是很有用,因为您还没有注册任何东西,因此只需在调用BuildServiceProvider之前进行所有操作即可:

var serviceProvider = new ServiceCollection()
    .AddDataProtection()
    .AddScoped<MyClass>()
    .BuildServiceProvider();

由于要利用数据保护,因此显然也需要Microsoft.AspNetCore.DataProtection NuGet。

然后,当您想要MyClass的实例时:

using (var scope = serviceProvider.CreateScope())
{
    var myClass = scope.GetRequiredService<MyClass>();
    myClass.RunSamples();
}

我想这就是您所缺少的(从此链接: https : //docs.microsoft.com/zh-cn/aspnet/core/security/data-protection/using-data-protection?view=aspnetcore-2.1

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();
}

您必须通过调用ActivatorUtilities.CreateInstance来启动IDataProtectionProvider的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM