首页 > 解决方案 > Autofac 实现接口的类型列表 / C# Asp.net

问题描述

我在 NServiceBus 调度程序中遇到了 Autofac 和内存泄漏的问题。但幸运的是我解决了这个问题。

BeginLifetimeScope / DbContext 的 Autofac 和内存泄漏已被处理 / C# asp.net

但现在我正在尝试稍微重构这部分。

我的代码:

public void Start()
{
    List<Type> jobTypes = new List<Type> { typeof(ExpiryDateTask) };

    foreach (var jobType in jobTypes)
    {
        _schedule.Every(TimeSpan.FromSeconds(30), () =>
        {
            using (var scope = _lifetimeScope.BeginLifetimeScope())
            {
                var job = scope.Resolve<IJob>();
                job.Run();
            }
        });
    }
}

我该如何重构这部分:

  1. List<Type> jobTypes = new List<Type> { typeof(ExpiryDateTask) };- 该列表应以某种方式由实现 IJob 接口的所有类型的任务填充。
  2. var job = scope.Resolve<IJob>();我认为这是错误的,应该看起来更像var job = resolveJob(jobType)- 所以基本上基于类型。

@编辑

点 (1) 通过获取所有实现接口的类型来解决

标签: c#asp.netautofac

解决方案


对于您问题的第二部分,您可以使用 Autofac子容器注册来做您想做的事情:

foreach (var jobType in jobTypes)
{
    _schedule.Every(TimeSpan.FromSeconds(30), () =>
    {
        using (var scope = _lifetimeScope.BeginLifetimeScope(builder =>
        {
            builder.RegisterType(jobType).As<IJob>();
        }))
        {
            var job = scope.Resolve<IJob>();
            job.Run();
        }
    });
}

这样,实现的类也IJob将受益于构造函数依赖注入。


推荐阅读