1

过去我一直在使用:

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

这会正确关闭/处置服务吗?有没有办法告诉?我担心以这种方式做事会让自己容易受到内存泄漏的影响。

4

1 回答 1

0

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

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

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

于 2013-06-04T20:03:07.407 回答