繁体   English   中英

using 语句中的可选上下文参数

[英]Optional context parameter in using statement

我有这个方法

public static List<_Account> Get(_User user, string name = null, SearchType sName = SearchType.Equals)
{
  using (Context context = new Context())
  {
    IQueryable<_Account> query = context.Accounts;
    if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
      query = query.Where(r => r.Name.Equals(name));
    if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
      query = query.Where(r => r.Name.StartsWith(name));
    if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
      query = query.Where(r => r.Name.Contains(name));
    return query.ToList();
  }
}

这可行,但是当我从另一个方法调用此方法时,我已经定义了一个上下文,我想重用该上下文。 我会添加一个可选参数

public static List<_Account> Get(..., Context ctx = null) {...

如果ctx != null我希望使用该上下文,而不是在最后处理 否则,我希望在 using 中创建的上下文在方法结束时被使用和处理。

您可以将null放入using块,因此可以进行以下工作:

public static List<_Account> Get(_User user, Context contextProvided = null, string name = null, SearchType sName = SearchType.Equals)
{
  using (Context contextInner = (contextProvided == null ? new Context() : null)) //magic here
  {
    Context context = contextProvided ?? contextInner; //magic here

    IQueryable<_Account> query = context.Accounts;
    if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
      query = query.Where(r => r.Name.Equals(name));
    if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
      query = query.Where(r => r.Name.StartsWith(name));
    if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
      query = query.Where(r => r.Name.Contains(name));
    return query.ToList();
  }
}

另一个好的方法是将方法(查询)的内容提取到帮助程序方法中。 然后,您可以将now外部方法复制为两个重载。 一个重载创建一个上下文,其中一个将其作为参数。

如果这种模式经常发生,您可以通过创建自定义IDisposable派生类来实现以下目的:

public static List<_Account> Get(_User user, Context contextProvided = null, ...)
{
  using (var contextProvider = new ContextProvider(contextProvided))
  {
    Context context = contextProvider.EffectiveContext;
    //...
  }
}

使用内部或外部上下文的另一种模式是:

void SomeMethod(Context context = null)
{
    Context contextToDispose = null;
    if(context == null) context = contextToDispose = new ContextCreator();
    
    using(contextToDispose)
    {
        context.DoThings();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM