gpt4 book ai didi

asp.net-mvc - 对 Asp.net Mvc 应用程序使用单个 Repository 实例有什么好处吗?

转载 作者:行者123 更新时间:2023-12-01 00:06:54 25 4
gpt4 key购买 nike

CarTrackr project , 它使用一些技术为 Asp.net Mvc 网站中的所有请求只创建 1 个存储库实例,并使用 UnityControllerFactory 类来管理所有存储库实例(发送到请求的 Controller )。

与每个请求创建新的存储库实例相比,使用单个存储库实例有什么好处吗?

我知道,它可能会提高整体性能。但是,它会导致任何交易问题吗?

部分 Global.asax

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
RegisterDependencies();
}

protected static void RegisterDependencies() {
IUnityContainer container = new UnityContainer();

// Registrations
container.RegisterType<IUserRepository, UserRepository>(new ContextLifetimeManager<IUserRepository>());
container.RegisterType<ICarRepository, CarRepository>(new ContextLifetimeManager<ICarRepository>());

// Set controller factory
ControllerBuilder.Current.SetControllerFactory(
new UnityControllerFactory(container)
);
}
}

部分 CarController.cs
[Authorize]
public class CarController : Controller
{
private IUserRepository UserRepository;
private ICarRepository CarRepository;

public CarController(IUserRepository userRepository, ICarRepository carRepository)
{
UserRepository = userRepository;
CarRepository = carRepository;
}
}

谢谢,

最佳答案

每个请求创建一个存储库实例 本身 不应导致任何性能问题;存储库通常非常浅,当它需要访问数据时,诸如连接池之类的东西可以最大限度地减少建立实际连接的成本。创建对象的成本非常低,特别是对于像 Web 请求这样的短期事件,对象在仍处于“零代”时被收集。

至于每个实例是有一个存储库还是一个存储库 - 这取决于存储库;-p

最大的问题是:您的存储库线程安全吗?如果不是:每个请求一个。

即使是这样;如果您的存储库本身保留了类似 LINQ-to-SQL 的内容 DataContext (您以某种方式同步),那么如果您长期保持这种状态,尤其是身份管理器,则会遇到大问题。您将很快使用大量内存并得到陈旧的结果。远形式理想。

使用单个存储库实例,您可能最终也会遇到很多试图获得线程安全的阻塞。这可以 减少 吞吐量。相反,数据库本身有实现粒度锁的好方法 - 当您考虑到并发请求通常会查看单独的表等时特别有用 - 因此在数据库层不会阻塞。仅在存储库层很难做到这一点 - 因此您可能必须同步整个“获取” - 非常糟糕。

IMO,在大多数情况下,每个请求一个就可以了。如果要缓存数据,请单独进行 - 即不要直接在存储库实例上。

关于asp.net-mvc - 对 Asp.net Mvc 应用程序使用单个 Repository 实例有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980442/

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