如何在 Autofac 中间接传递参数

本文关键字:参数 中间 Autofac | 更新日期: 2023-09-27 18:32:07

我有一个通过Func<Owned<OwnedDependency>>注入的依赖项。它的一个依赖项需要一个参数,我只会在构造 OwnedDependency 时拥有该参数。

public class OwnedDependency
{
    public OwnedDependency(IDependency1 dependency)
    {
    }
}
public interface IDependency1
{
}
public class Dependency1 : IDependency1
{
    public Dependency1(MyParameter parameter)
    {
    }
}
public class MyClass
{
    private readonly Func<Owned<OwnedDependency>> m_ownedDependencyFactory;
    public MyClass(Func<Owned<OwnedDependency>> ownedDependencyFactory)
    {
        m_ownedDependencyFactory = ownedDependencyFactory;
    }
    public void CreateOwnedDependency()
    {
        var parameter = new MyParameter(...);
        // ** how to setup parameter with the container? **
        using (var ownedDependency = m_ownedDependencyFactory())
        {
        }
    }
}

我无法找到一种干净的方法来设置 MyParameter 的实例。

我探索的一种方法是将ILifetimeScope注入MyClass,然后执行以下操作:

var parameter = new MyParameter(...);
using (var newScope = m_lifetimeScope.BeginLifetimeScope())
{
    newScope.Resolve<IDependency1>(new TypedParameter(typeof(MyParameter), parameter));
    var ownedDependency = newScope.Resolve<OwnedDependency>();
    // ...
}

但是容器正在变得不必要地侵入。理想情况下,我想做的是注入Func<IDependency1, Owned<OwnedDependency>>并且容器愿意使用传入的参数来满足任何必要的依赖项,而不仅仅是 OwnedDependency 上的依赖项。

如何在 Autofac 中间接传递参数

使用另一个工厂进行IDependency1分两步进行解析怎么样:

public class MyClass
{
    private Func<MyParameter, IDependency1> dependency1Factory;
    private Func<IDependency1, Owned<OwnedDependency>> ownedDependencyFactory;

    public MyClass(
        Func<MyParameter, IDependency1> dependency1Factory,
        Func<IDependency1, Owned<OwnedDependency>> ownedDependencyFactory)
    {
        this.dependency1Factory = dependency1Factory;
        this.ownedDependencyFactory = ownedDependencyFactory;
    }
    public void CreateOwnedDependency()
    {
        var parameter = new MyParameter();
        using (var owned = ownedDependencyFactory(dependency1Factory(parameter)))
        {
        }
    }
}