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 などをダウンロードし、これらのサービスでオブジェクトをコンストラクターに挿入できます。第二に、あなたがしているのは貧乏人の依存性注入です。フィルターの 1 つで例外が発生した場合、またはアプリケーションの障害が発生した場合はどうなりますか? 現在の実装では、リソースのクリーンアップを制御する方法がありません。

要約すると、車輪の再発明です。このようにする特別な要求がない限り、実際には意味がありません。

最後にもう一つ。このメソッドには何も実装されていないbase.OnActionExecuted(filterContext)ため、実際に呼び出す必要はありません。ActionFilterAttribute基本的には空のメソッド本体です。

于 2013-06-04T20:03:07.407 に答える