使用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();
}

这将正确关闭/处置服务吗?有办法知道吗?我担心这样做会使自己容易发生内存泄漏。

使用ActionFilter打开/关闭web服务是否能正常工作?

在某种程度上,你走在一条很好的道路上,但是你为什么决定这样做呢?首先,你应该使用依赖注入。你可以使用NuGet下载Unity, Ninject等,并让这些服务注入一个对象到你的构造函数中。其次,您正在做的是穷人的依赖注入。如果在某个过滤器中引发了异常,或者出现了应用程序故障,会发生什么情况?使用当前的实现,您无法控制资源清理。

总而言之,你是在重新发明轮子。除非你有特殊要求,否则这样做是没有意义的。

最后还有一件事。你不需要调用base.OnActionExecuted(filterContext),因为ActionFilterAttribute没有为这个方法实现任何东西。它基本上是一个空的方法体。