[英]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:
您需要在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.