为什么有些 ioc 框架如此复杂?因为似乎只需几行代码就可以做到这一点

本文关键字:几行 代码 这一点 就可以 框架 ioc 因为 复杂 为什么 | 更新日期: 2023-09-27 18:31:11

我提到的ioc框架是Unity,Autofac,structuremap等。

代码为:

public class Ioc
{
    private static readonly Dictionary<Type, Type> mapper = new Dictionary<Type, Type>();
    public static T CreateInstance<T>()
    {
        var t = typeof (T);
        if (mapper.ContainsKey(t))
        {
            return (T) Activator.CreateInstance(mapper[t]);
        }
        return Activator.CreateInstance<T>();
    }
    public static void Map<TInterface, TImplementation>() where TImplementation : TInterface
    {
        var inferfaceType = typeof (TInterface);
        var implementationType = typeof (TImplementation);
        if (mapper.ContainsKey(inferfaceType))
        {
            mapper[inferfaceType] = implementationType;
        }
        else
        {
            mapper.Add(inferfaceType, implementationType);
        }
    }
}

它可以像这样使用:

Ioc.Map<IUserService, UserService>();
Ioc.Map<IUserBusiness, UserBusiness>();

var userService = Ioc.CreateInstance<IUserService>()

它的使用方式与使用 ioc 框架的方式相同。

它们之间有很大的性能差异吗?

为什么有些 ioc 框架如此复杂?因为似乎只需几行代码就可以做到这一点

性能是否存在"巨大差异"完全取决于上下文。问题是:在您的情况下它是否足够快,这是否解决了您的所有需求?

看看 .NET 的不同 DI 库之间的这个非常有趣的比较。它比较了主要 8 个库和许多其他小型库之间的性能。

但是除了性能之外,您还应该注意许多其他功能,这些功能可能会对您有很大帮助。例如,一些库(Castle Windsor和Simple Injector)包含"诊断服务",可帮助您找到可能的错误配置,否则很难检测到(例如强制依赖项和许多其他错误)。例如,Simple Injector遵循非常严格的设计原则,试图最大限度地减少您作为用户可能犯的配置错误。

使 DI 库的内部实现更加复杂的其他功能包括生活方式管理、自动连线、循环依赖关系检测、解析集合、解析泛型类型等功能。不要忘记与各种不同的框架和技术的集成。

所以总的来说,我不建议使用你自己的迷你DI库。要么使用现有的 DI 库之一,要么根本不使用容器。请注意,不使用 DI 库与不使用依赖注入模式不同!绝对应该应用依赖关系注入,但 DI 库是否对应用程序有益取决于应用程序的大小。如果应用程序很小,在合成根中手动连接所有对象图并不丢人。作为一项好处,您可以免费获得编译时支持。