在Autofac / c#中作为参数传递时解析类型(请检查示例代码)

问题描述 投票:0回答:2

我在.Net Core 2.1应用程序中使用Autofac。我有一个类,它使用new关键字直接实例化一个类型,因此它与特定的实现相关联。如何使用Autofac解析类型而不是使用new?该方法创建一个Engine类型的对象,并将其添加到IEngine类型的集合中,其中Engine实现IEngine。因此,构造函数或方法解析将不起作用。

以下是示例代码:

public class Vehicle<T1> : IVehicle<T1>
{
    private Dictionary<string, IEngine<T>> Engines = new Dictionary<string, IEngine<T>>();

    public void Create(string id)
    {
        IEngine<T> engine = new Engine<T>();

        // use engine...

        Engines.Add(id, engine);
    }
}

如您所见,Vehicle与IEngine的实现紧密耦合。在这种情况下,如何使用Autofac动态解析IEngine?我认为我的问题是我没有对Autofac容器的引用。如何在这样的类中获得对容器的引用?

c# autofac
2个回答
0
投票

以下是如何使用Autofac中的自动生成的委托工厂实例化引擎的示例。你看,Autofac能够自动完成:

public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterGeneric(typeof(Vehicle<>)).As(typeof(IVehicle<>));
        builder.RegisterGeneric(typeof(Engine<>)).As(typeof(IEngine<>));
        var container = builder.Build();

        var vehicle = container.Resolve<IVehicle<object>>();
        vehicle.Create("1");

        Console.WriteLine(vehicle.EngineCount);
        Console.ReadKey();
    }
}

public interface IVehicle<T>
{
    void Create(string id);

    /// <summary>
    /// This property is just for testing
    /// </summary>
    int EngineCount { get; }
}

public class Vehicle<T> : IVehicle<T>
{
    private readonly Func<IEngine<T>> _engineFactory;
    private Dictionary<string, IEngine<T>> Engines = new Dictionary<string, IEngine<T>>();

    /// <summary>
    /// This property is just for testing
    /// </summary>
    public int EngineCount => Engines.Count;

    public Vehicle(Func<IEngine<T>> engineFactory)
    {
        _engineFactory = engineFactory;
    }

    public void Create(string id)
    {
        IEngine<T> engine = _engineFactory();

        // use engine...

        Engines.Add(id, engine);
    }
}

public interface IEngine<T>
{
}

public class Engine<T> : IEngine<T>
{
}

请注意,我已将类型为Vehicle<>的泛型类型参数的名称从T1更改为T,以使其对应于类型参数,该参数在Engine<T>实例的类中使用。希望能帮助到你。


0
投票

我认为最好将Engine对象的实例化委托给另一个类,例如Factory可以帮助您将IEngine解析为所需的具体引擎类。

此外,您可以在此处使用事件,因此此处的Create方法是您需要引擎的触发器,在事件/委托的某个其他类上,您可以解析并将引擎传递给它。

© www.soinside.com 2019 - 2024. All rights reserved.