在autofac中处理Func <T>注册

时间:2019-08-14 16:43:24

标签: c# autofac func

我正在用ASP.NET Core服务器中的autofac注册If MsgBox("Would you like to populate the team lists?", vbOKCancel) = vbOK Then 'run your code End If

我想在多个地方使用注册,但是我只想调用一次任务,问题是结果永远不会被丢弃

注册代码:

func<Task<T>>

使用代码:

 var getItemMethod = GetType()
                .GetMethod(nameof(GetItem), BindingFlags.NonPublic | BindingFlags.Instance)
                .MakeGenericMethod(resultType);

builder.Register(c => getItemMethod.Invoke(this, new[] { c.Resolve(resultType), task}))
                        .As(importResultDelegate)
                        .InstancePerMatchingLifetimeScope(SCOPE_TAG);

private Func<T> GetItem<T>(object obj, MethodInfo task)
            where T : class
{
  T output = null;
  return () => output ?? ((T)task.Invoke(obj, null))
      .Tee(o => output = o);
}

这称为

public Constructor(Func<Task<Object>> objectFac)

var data = await objectFac();

由于using(var inner = scope.BeginLifetimeScope(SCOPE_TAG){} 从未被丢弃,导致服务器内存泄漏

我尝试使用T output,但是它从未被调用。

1 个答案:

答案 0 :(得分:1)

如果要由Autofac处理它,则需要使用实现IDisposable而不是Func<T>的类。来自Autofac documentation

  

要利用自动确定性处置的优势,您的组件   必须实现IDisposable。

否则,您需要手动处理工厂生产的T对象。