使用ActionFilter打开/关闭web服务是否能正常工作?
本文关键字:常工作 工作 是否 打开 ActionFilter 关闭 服务 web 使用 | 更新日期: 2023-09-27 18:16:50
过去我一直使用:
using (LoginServiceClient = new LoginServiceClient()) {
//do stuff
service.Close();
}
但现在,我正在努力:
public class UseLoginService : ActionFilterAttribute {
LoginServiceClient = new LoginServiceClient();
public override void OnActionExecuting(ActionExecutingContext filterContext) {
base.OnActionExecuting(filterContext);
filterContext.ActionParameters["service"] = service;
}
public override void OnActionExecuted(ActionExecutedContext filterContext) {
base.OnActionExecuted(filterContext);
service.Close();
}
}
[UseLoginService]
public ActionResult myAction(LoginServiceClient service) {
//service is accessible here
return View();
}
这将正确关闭/处置服务吗?有办法知道吗?我担心这样做会使自己容易发生内存泄漏。
在某种程度上,你走在一条很好的道路上,但是你为什么决定这样做呢?首先,你应该使用依赖注入。你可以使用NuGet下载Unity, Ninject等,并让这些服务注入一个对象到你的构造函数中。其次,您正在做的是穷人的依赖注入。如果在某个过滤器中引发了异常,或者出现了应用程序故障,会发生什么情况?使用当前的实现,您无法控制资源清理。
总而言之,你是在重新发明轮子。除非你有特殊要求,否则这样做是没有意义的。最后还有一件事。你不需要调用base.OnActionExecuted(filterContext)
,因为ActionFilterAttribute
没有为这个方法实现任何东西。它基本上是一个空的方法体。