Переопределить возврат объекта по умолчанию в c # - PullRequest
0 голосов
/ 22 января 2019

При возврате объекта я хочу убедиться, что действие выполнено непосредственно перед возвращением if.Есть ли способ переопределить возврат объекта по умолчанию для выполнения этого?

например

//In the constructor I set a query start time
var items = new ListReturnDTO<Product>();

    ....

//I want to set a query end time, but without the need to set the variable in code as it could be forgotten. 
return items;

РЕДАКТИРОВАТЬ:

      //I set the QueryStartTime in the constructor
      var items = new ListReturnDTO<Product>();

            items.TotalItem = 11;

            ........

            items.data.Add(new Product { SKU = "000006", Description = "this is the test product 7, a rare breed of product", Price = 65.00, QuantityLeft = 3, Title = "Test Product 7", IsPreview = false });
            items.data.Add(new Product { SKU = "000007", Description = "this is the test product 8, a rare breed of product", Price = 7.00, QuantityLeft = 30, Title = "Test Product 8", IsPreview = false });

            //force a delay to replicate talking to external source
            Thread.Sleep(2000);

            //Currently i set QueryEndTime Here
            items.QueryEndTime = DateTime.UtcNow.TimeOfDay;

            //But i want it to be done automatically on the return (like how I can set QueryStartTime in the constructor, is there an equivalent/an override for the return)
            return Task.FromResult(items);

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Итак, у вас есть несколько методов или классов, которые выполняют некоторые запросы и заполняют ваши данные. Вы хотите записать время начала и окончания запроса в возвращаемом объекте, который всегда будет иметь тип ListReturnDTO<T>, где T - тип запрашиваемой сущности.

Вашему вопросу не хватает небольшого контекста, но, предполагая, что вы используете что-то вроде шаблона репозитория, вы можете сделать так, чтобы ваш базовый репозиторий выглядел следующим образом, с публично вызываемым методом, который, в свою очередь, вызывает абстрактный метод, который должен быть реализован производным классом. , перекладывая фактическую работу на более специализированный тип:

public abstract class BaseRepository<TEntity>
{
    public async Task<ListReturnDTO<TEntity>> QueryDataAsync()
    {
        var items = new ListReturnDTO<TEntity>();

        items.QueryStartTime = DateTime.UtcNow;

        await QueryAndPopulateDataAsync(items);

        items.QueryEndTime = DateTime.UtcNow;

        return items;
    }

    protected abstract Task QueryAndPopulateDataAsync(ListReturnDTO<TEntity> container);
}

Если у вас есть один метод, который всегда вызывается, QueryDataAsync(), который назначает свойства, которые вы всегда хотите назначить.

Теперь, чтобы реализовать реальный репозиторий, вы наследуете базовый и выполняете фактические запросы в QueryAndPopulateDataAsync():

public class ProductRepository : BaseRepository<Product>
{
    protected override async Task QueryAndPopulateDataAsync(ListReturnDTO<TEntity> container)
    {
        container.TotalItem = 11;

        ........

        container.data.Add(new Product { SKU = "000006", Description = "this is the test product 7, a rare breed of product", Price = 65.00, QuantityLeft = 3, Title = "Test Product 7", IsPreview = false });
        container.data.Add(new Product { SKU = "000007", Description = "this is the test product 8, a rare breed of product", Price = 7.00, QuantityLeft = 30, Title = "Test Product 8", IsPreview = false });

        //force a delay to replicate talking to external source
        Thread.Sleep(2000);
    }
}

И назовите это так:

var repo = new ProductRepository();
var data = await repo.QueryDataAsync();

И data будут назначены свойства QueryStartTime, QueryEndTime и data.

0 голосов
/ 22 января 2019

Согласно моему пониманию вопроса

В конце метода вызовите некоторый код автоматически.Или, более конкретно, если возвращаемый тип метода не void, выполните какое-то действие.Таким образом, в данном примере следует обновить QueryEndTime.

Эта концепция выглядит как аспектно-ориентированное программирование .Возможно, вы захотите попробовать одну из библиотек: Postsharp .Также есть несколько других.

У Postsharp есть декоратор метода , который может внедрять поведение до и после выполнения метода.Пример кода из предыдущей ссылки

[PSerializable]
public class LoggingAspect : OnMethodBoundaryAspect
{

  public override void OnEntry(MethodExecutionArgs args)
  {
     Console.WriteLine("The {0} method has been entered.", args.Method.Name);
  }

  public override void OnSuccess(MethodExecutionArgs args)
  {
      Console.WriteLine("The {0} method executed successfully.", args.Method.Name);
  }

  public override void OnExit(MethodExecutionArgs args)
  {
     Console.WriteLine("The {0} method has exited.", args.Method.Name);
  }     

  public override void OnException(MethodExecutionArgs args)
  {
      Console.WriteLine("An exception was thrown in {0}.", args.Method.Name);
  }

}

static class Program
{
   [LoggingAspect]
   static void Main()
   {
     Console.WriteLine("Hello, world.");
   }
}

Теперь перейдем к вашему примеру кода, если это один раз, посмотрите на этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...