C# 实现IOC容器的简单实例

using System;
using System.Collections.Generic;
using System.Linq;

public interface ICar
{
    void Drive();
}

public class Car : ICar
{
    public void Drive()
    {
        Console.WriteLine("Driving a car...");
    }
}

public interface IDriver
{
    void DriveCar();
}

public class Driver : IDriver
{
    private readonly ICar car;
    public Driver() { }

    public Driver(ICar car)
    {
        this.car = car;
    }

    public void DriveCar()
    {
        car.Drive();
    }
}

public interface IContainer
{
    void Register<TFrom, TTo>();
    T Resolve<T>();
}

public class Container : IContainer
{
    private readonly IDictionary<Type, Type> mappings = new Dictionary<Type, Type>();

    public void Register<TFrom, TTo>()
    {
        mappings[typeof(TFrom)] = typeof(TTo);
    }

    public T Resolve<T>()
    {
        var type = typeof(T);
        if (!mappings.ContainsKey(type))
        {
            throw new InvalidOperationException($"No mapping found for type {type.FullName}");
        }
        return (T)Create(mappings[type]); 
    }

    private object Create(Type type)
    {
        var constructors = type.GetConstructors();
        List<object> parameters = new List<object>();
        if(constructors.Length > 0)
        {
            var constructor = constructors.OrderByDescending(o => o.GetParameters().Length).FirstOrDefault();
            if (constructor != null)
            {
                foreach (var par in constructor.GetParameters())
                {
                    parameters.Add(Create(mappings[par.ParameterType]));
                }
            }
        }
        return Activator.CreateInstance(type, parameters.ToArray());
    }

}

public class Program
{
    public static void Main()
    {
        var container = new Container();
        container.Register<ICar, Car>();
        container.Register<IDriver, Driver>();

        var driver = container.Resolve<IDriver>();
        driver.DriveCar();

        Console.ReadLine();
    }
}

 

这个示例中,我们定义了一个简单的ICar和IDriver接口,并且实现了Car和Driver类。Driver类需要一个ICar对象才能工作。我们使用容器来注入ICar到Driver中,从而避免了显式地创建依赖项。Container类实现了IContainer接口,提供了Register方法来注册依赖项类型和实现类型的映射,同时提供了Resolve方法来解析依赖项并创建实例。

在Main方法中,我们首先创建一个容器对象,并向容器注册ICar和IDriver类型的映射。然后,我们从容器中解析IDriver类型的实例,并调用DriveCar方法来启动程序。由于Driver类的构造函数需要ICar类型的依赖项,容器会自动创建Car类的实例,并注入到Driver类的构造函数中,使得程序正常运行。

posted @ 2023-03-15 21:17  紫月银空  阅读(284)  评论(0编辑  收藏  举报