gpt4 book ai didi

asp.net-mvc - MVC DI/IoC 依赖太多?

转载 作者:行者123 更新时间:2023-12-04 20:03:17 25 4
gpt4 key购买 nike

给定这个 MVC Controller 的例子;伪代码...

PostController
{
private IGetPost _getPost;
private ICreatePost _createPost;
private IDeletePost _deletePost;
private IUpdatePost _updatePost;

public ActionResult Get()
{
return _getPost();
}

public ActionResult Create(post)
{
return _createPost(post);
}

public ActionResult Update(posts)
{
return _updatePost(post);
}

public ActionResult Delete(post)
{
return _deletePost(post);
}
}

我的问题是,如果 Controller 上的任何一个操作被调用, Controller 的所有依赖项都会为它们创建实例,这似乎是一个性能问题。有一个更好的方法吗?我唯一的想法是创建 4 个不同的 Controller ,每个 Controller 只有一个 Action ,但这似乎有点矫枉过正。我还考虑过在每个操作中直接调用 DependencyResolver,但我不确定如果我这样做对单元可测试性有何影响。

最佳答案

为什么它是一个性能嗡嗡声?您是否测量过是这种情况?虽然在确定哪些实现映射到哪些接口(interface)方面存在开销,但大多数 dependency injection (DI) 值得他们盐分的容器将执行此映射一次(并且通常会动态创建编译代码,以便尽可能快地查找)以创建映射。

这只是创建对象的问题,这与使用 new keyword 没有什么不同。 .

对于一般情况,这不会影响性能。考虑到这是一个 Web 应用程序,如果您获得 Stack Overflow 级别的流量,那么它很可能成为扩展的障碍;这些操作中的每一个都很便宜,但是当乘以数百万倍时,总的来说,它非常昂贵,而且通常,这些都是可能导致资源争用等的事情类型。

假设情况并非如此(Stack Overflow 的流量级别),您可能很可能会在构造函数的实现中遇到性能问题.

如果这四个接口(interface)(或其中任意数量的接口(interface))的实现成本很高,那不是 DI 的功能,而是您代码的功能,您将从优化中获得更多好处.

调整依赖项注入(inject)可能唯一有益的地方是,如果构建一个或多个这些实现具有高开销,并且您让 DI 容器创建一个 所有 接口(interface)实现的实例,而不是每个 接口(interface)实现的一个实例。但是,当您确定该选项对您可用时,您应该通过 DI 层查看生命周期管理(意思是,让该类的一个实例来服务所有请求是可行的;它是线程吗? -安全吗?它会长时间占用任何资源吗?等)

如果您真的担心这一点并且上述内容不适用或不是一个选项,那么是的,您可以创建一些较小的 Controller ,并且出于其他原因这可能有意义;如果您正在执行的操作在逻辑上彼此不相关,它们可能应该在单独的 Controller 中。

但是,从您的行为来看,您的逻辑划分似乎是正确的。

长话短说,不要尝试在您未将其作为衡量因素的地方优化性能。

就是说,无论您做什么,都解决类内部的依赖关系。如果这样做,您将失去 DI 的所有好处,并且将您的类紧紧绑定(bind)到 DI 容器(并且可能会破坏其可测试性)。

关于asp.net-mvc - MVC DI/IoC 依赖太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14156941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com