【发布时间】:2017-03-23 02:44:51
【问题描述】:
我有一个旧的 .NET 应用程序,它使用 Ninject 来解析 ICommandHandler 的实例,如下所示。我还使用 Db 上下文来调用 SaveChanges()。我现在正在尝试转换此代码,以便可以在具有内置依赖注入的新 .NET Core 应用程序中使用它。
public class CommandInvoker : ICommandInvoker
{
private readonly IKernel _kernel;
private readonly IArhomaContext _context;
public CommandInvoker(IKernel kernel, IArhomaContext context)
{
_kernel = kernel;
_context = context;
}
public void Execute<T>(T command)
{
var handler = _kernel.TryGet<ICommandHandler<T>>();
handler.Handle(command);
_context.SaveChanges();
}
}
我在想我必须在 Startup.cs 中的 ConfigureServices 方法中添加以下内容:
services.AddScoped<ICommandHandler, CommandHandler>();
但是 ICommandHandler 有一个类型化的参数。这是如何完成或注册的?
其次,我需要解决它以创建一个执行命令的处理程序。如何在 .NET Core 中解决这个问题?
附:我不想继续在我的 .NET Core 应用中使用 Ninject。
【问题讨论】:
-
services.AddScoped(typeof(ICommandHandler<>), typeof(CommandHandler<>)); -
谢谢卢克,但我该如何解决呢?在 Ninject 中有 kernel.TryGet,但是在 Core 中是如何完成的呢?
-
您可能正在使用 Ninject 的批量注册功能通过一次调用注册所有命令处理程序。这是 Microsoft 容器所没有的。这是您必须自己构建的东西,或者您需要使用可以在 .NET Core 容器之上执行此操作的第 3 方工具。请注意,.NET Core 中缺少许多对您的应用程序可能很重要的功能。切换到这种非常简单的 DI 实现可能并不总是产生最好的结果。
标签: c# dependency-injection asp.net-core