我ravendb
用作存储后端。由于它使用unit of work
模式,我需要打开会话、执行操作、保存结果和关闭会话。我想保持我的代码干净,并且不要在每个操作中显式调用会话打开和关闭,所以我将此代码放入OnActionExecuting
和OnActionExecuted
方法中,如下所示:
#region RavenDB's specifics
public IDocumentSession DocumentSession { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.IsChildAction)
{
return;
}
this.DocumentSession = Storage.Instance.OpenSession();
base.OnActionExecuting(filterContext);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.IsChildAction)
{
return;
}
if (this.DocumentSession != null && filterContext.Exception == null)
{
this.DocumentSession.SaveChanges();
}
this.DocumentSession.Dispose();
base.OnActionExecuted(filterContext);
}
#endregion
但是有些动作需要连接ravendb
而不需要。所以我决定创建自定义属性并标记方法需要用它打开 DocumentSession。这是一个例子:
//
// GET: /Create
[DataAccess]
public ActionResult Create()
{
return View();
}
我卡住了。我的计划是在OnActionExecuted
方法中检索操作的属性,如果[DataAccess]
存在,则打开DocumentSession
.
在我可以通过语句OnActionExecuted
检索操作名称(方法名称) 。filterContext.ActionDescriptor.ActionName
但是如何使用反射检索给定类的方法属性?
我发现它可能是Attribute.GetCustomAttributes
调用的,但我得到的最接近 - 我需要MemberInfo
该方法的对象。但是我怎样才能得到这个MemberInfo
名称给出的方法呢?