簡體   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