- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道有 IServiceCollection
接口(interface),我可以在其中注册我的服务,还有 IServiceProvider
可以实例化服务。
如何根据指定的类型实例化一个使用注册服务的类?
class MyClass
{
public MyClass(ISomeService someService) { }
}
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<ISomeService, SomeService>()
MyClass instance = CreateInstance(typeof(MyClass));
object CreateIntance(Type type)
{
???
}
例如,ASP.NET Core 如何创建 Controller 实例?
我已经简单地实现了激活器,但是 .NET Core 中不是已经有类似的东西了吗?
private static object CreateInstance(Type type, IServiceProvider serviceProvider)
{
var ctor = type.GetConstructors()
.Where(c => c.IsPublic)
.OrderByDescending(c => c.GetParameters().Length)
.FirstOrDefault()
?? throw new InvalidOperationException($"No suitable contructor found on type '{type}'");
var injectionServices = ctor.GetParameters()
.Select(p => serviceProvider.GetRequiredService(p.ParameterType))
.ToArray();
return ctor.Invoke(injectionServices);
}
}
编辑:这是我的场景。我重构了一些实现此接口(interface)的遗留代码。
public interface IEventDispatcher
{
void RegisterHandler(Type handler);
void Dispatch(DomainEvent @event);
}
在 Dispatch 方法实现中,我创建处理程序的实例:
public class InMemoryBus : IEventDispatcher
{
private readonly List<Type> _handlers = new List<Type>();
private readonly Func<Type, object> activator;
/// <param name="activator">Used to create instance of message handlers</param>
public InMemoryBus(Func<Type, object> activator)
{
this.activator = activator;
}
public void Dispatch(DomainEvent @event)
{
Type messageType = message.GetType();
var openInterface = typeof(IHandleMessages<>);
var closedInterface = openInterface.MakeGenericType(messageType);
var handlersToNotify = from h in _handlers
where closedInterface.GetTypeInfo().IsAssignableFrom(h.GetTypeInfo())
select h;
foreach (Type h in _handlersToNotify)
{
//this is the tricky part
var handlerInstance = activator(h);
closedInterface.GetTypeInfo()
.GetMethod(nameof(IHandleMessages<T>.Handle))
.Invoke(handlerInstance, new[] { message });
}
}
public void RegisterHandler(Type type) => _handlers.Add(type);
}
最佳答案
https://stackoverflow.com/a/45756192/45091是正确的做事方式。
For example, how does ASP.NET Core creates controller instances?
如果您不想注册服务,您可以使用我们所说的“类型激活”。有一种名为 ActivatorUtilities 的类型,它具有您想要的帮助器方法。您调用 ActivatorUtilities.CreateInstance(serviceProvider, type) ,它将使用指定的服务提供程序激活该类型。
关于c# - 使用ctor注入(inject)和ServiceProvider创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45755871/
在 .NET Core Console 应用程序中,我想使用内置的依赖注入(inject),包括自动处理链中的 IDisposable 对象。在 ASP.NET Core 中,对象是随每个请求创建和释
我有一个关于 Laravel 的问题。使用ServiceProviders的区别在哪里?或 Middleware在 Laravel 中? 所以我的意思是,我什么时候使用 ServiceProvider
我创建了这个提供程序: php artisan make:provider ShortcodesServiceProvider 然后我不得不删除该文件,但现在我得到了 FatalThrowableEr
我正在权衡在独立包中测试我的 ServiceProvider 的利弊。 由于 laravel 应用程序不是包的依赖项,我认为我不应该/不能编写集成测试。 但有时我在使用语句中出现拼写错误,导致我只为这
我正在使用这种方法构建服务实现: 我正在使用 Microsoft.Extensions.DependencyInjection 并尝试实现以下目标: 创建本地 ServiceCollection 并保
文件:Composer.json --------------------------------------- { "name": "laravel/laravel",
我有asp.net 核心应用程序。我将 Options 存储在 appsettings.json 文件中。我向服务注册了 Options,然后尝试在 Configure 方法中解决它。 但是服务提供商
设置:在我们公司,我尝试将基于 Ant 的 Netbeans 应用程序迁移到 Maven。我有一个基于 Maven 的 Netbeans 平台应用程序和两个包含 Netbeans 模块的 Maven
我觉得我已经搜索了整个互联网,但似乎无法弄清楚这个问题。我正在使用 Silex(最新版本),似乎无法弄清楚如何使用 Silex 的 ServiceProvider 系统返回一个类的实例以供使用。 我确
所以我有一个 Laravel 服务提供者,我想在应用它时创建一个 DEBUG 日志条目: app['log']->debug('message'); //fails too } } 如何做到这
如果您编写自己的 MarkupExtension,您可能会偶然发现 IServiceProvider serviceProvider 参数在设计时与运行时不同。例如,您无法获取 IRootObject
我为 paypal 创建了一个自定义服务提供商。当我尝试从提供者内部访问配置时,它返回 null。 下面是我写的代码。 public function register() { $this->
我正在用 Laravel 编写一个小 API,部分目的是为了学习这个框架。我想我在文档中发现了一个漏洞,但这可能是因为我不理解“Laravel 方式”来做我想做的事。 我正在编写一个 HTTP API
我正在研究 Laravel 5.2 中的 api 部分,并尝试从 Strava 获取详细信息。正如此链接中提到的 http://socialiteproviders.github.io/provide
我是 PHP 和 Laravel 的新手。我按照本教程将 reCAPTCHA 支持添加到我的 Laravel 应用程序中的页面: http://tutsnare.com/how-to-use-capt
我在 .NET 4.6.2 上有一个 Windows 服务,我在其中使用 .NET ServiceProvider(System.IServiceProvider 接口(interface))将 EF
我想改变路由的路径,但它仍然给出错误 Class HomeController does not exist 下面是我的代码 In app/Http/routes.php page Route::ge
有什么好办法可以拿到ServiceProvider在 AddOpenIdConnect , 或 稍后在我们完全设置 DI 容器的地方配置 ClientSecret? (例如在 Configure(IA
我编写了一个 aspnet core 控制台应用程序,该应用程序将 Entity Framework Core 与 SQL Server 结合使用。该应用程序有多个 Azure 服务总线队列客户端,我
friend 们大家好,我是 Laravel 框架的新手。 我在应用程序文件夹中创建模块目录。 然后我还在模块目录中创建 ServiceProvider.php 文件。 我的文件结构如下。 app\m
我是一名优秀的程序员,十分优秀!