【发布时间】:2018-02-09 22:18:39
【问题描述】:
我有一个在 ASP.NET MVC 5 框架之上使用 c# 编写的应用程序。
我通过继承ActionFilterAttribute 类创建了一个自定义操作过滤器(即ValidateCookieValueAction)。我正在为我的多个操作方法使用ValidateCookieValueAction 属性。
过滤器的目的是确保用户在允许他们进行操作之前拥有 cookie 值。尽管存在安全问题,但过滤器效果很好。但是,cookie 值本身需要在用户进入之前进行验证。
要验证 cookie 值,我需要一个 DbContext 的实例,以便查询数据库并验证 cookie 值。
我知道我可以直接在 ActionFilter 内创建 DbContext 的新实例。但是,我想这样做。我希望能够传递我已经从控制器创建的DbContext 实例,以允许我重用我已经在控制器中建立的连接。
这是我的控制器的设置方式
public class BaseController
{
protected IDbContext Context { get; private set; }
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
Context = new DbContext();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Context.Dispose();
}
base.Dispose(disposing);
}
}
public class TestController : BaseController
{
[ValidateCookieValueAction]
public ActionResult Index()
{
// the uses is in!
return View();
}
}
这是我的动作过滤器类
public class ValidateCookieValueAction : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var cookie = new CookieJar(filterContext.HttpContext);
if (!cookie.Has(ContactListCookieName))
{
var Url = new UrlHelper(filterContext.RequestContext);
var url = Url.Action("Guest", "Test");
filterContext.Result = new RedirectResult(url);
}
}
}
如何将Context 的实例传递给ValidateCookieValueAction?
【问题讨论】:
-
如果除了连接重用之外没有其他问题,那么继续并在您的过滤器中启动一个新的 DbContext。 EF 保留一个与数据库的开放连接池,并将获取其中一个来为新上下文提供服务。
-
@SamAxe 但框架随后会发出 2 个不同的 DbContaxt 实例,我也试图避免这种情况。
-
DbContexts 便宜并且应该有很短的寿命。您应该在您的操作过滤器中创建一个新实例。
-
@Mike:我认为将它包装在 using 块中比保留实例并传递它更可取(如果在过滤器中抛出异常,你将如何处理它,如果你这样做在过滤器本身中,控制器将如何检测到 dbcontext 已被处置...)。此外:我非常同意戴。
-
如果你想为每个请求使用一个 dbcontext,你将需要一个带有每个请求生命周期管理器的 DI 容器。与此类似:stackoverflow.com/questions/27065538/… 将数据访问逻辑隔离到“数据层”也是一个好主意。
标签: c# asp.net-mvc asp.net-mvc-5 actionfilterattribute custom-action-filter