为什么有些 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 框架的方式相同。
它们之间有很大的性能差异吗?
性能是否存在"巨大差异"完全取决于上下文。问题是:在您的情况下它是否足够快,这是否解决了您的所有需求?
看看 .NET 的不同 DI 库之间的这个非常有趣的比较。它比较了主要 8 个库和许多其他小型库之间的性能。
但是除了性能之外,您还应该注意许多其他功能,这些功能可能会对您有很大帮助。例如,一些库(Castle Windsor和Simple Injector)包含"诊断服务",可帮助您找到可能的错误配置,否则很难检测到(例如强制依赖项和许多其他错误)。例如,Simple Injector遵循非常严格的设计原则,试图最大限度地减少您作为用户可能犯的配置错误。
使 DI 库的内部实现更加复杂的其他功能包括生活方式管理、自动连线、循环依赖关系检测、解析集合、解析泛型类型等功能。不要忘记与各种不同的框架和技术的集成。
所以总的来说,我不建议使用你自己的迷你DI库。要么使用现有的 DI 库之一,要么根本不使用容器。请注意,不使用 DI 库与不使用依赖注入模式不同!绝对应该应用依赖关系注入,但 DI 库是否对应用程序有益取决于应用程序的大小。如果应用程序很小,在合成根中手动连接所有对象图并不丢人。作为一项好处,您可以免费获得编译时支持。