Внедрение свойства в класс расширения с помощью autofac - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу внедрить свой класс (IDateTimeService) в класс расширений с помощью внедрения свойства, как вы можете видеть:

public  static  class DateTimeGetter
{

    public static  IDateTimeService Localdate { set; get; }

    public async  static Task<DateTime> FromService(this DateTime value)
    {
        //ocaldate = localdate;
        return await Localdate.Get();
    }
}

Я использовал restease для подключения к другому микросервису с использованием интерфейса каквы можете увидеть:

public interface IDateTimeService
    {
        [AllowAnyStatusCode]
        [Get("api/LocalTime")]
        Task<DateTime> Get();
    }

Наконец, я добавил код впрыска в мой файл запуска:

      builder.RegisterType<IDateTimeService>();

Проблема заключается в том, что при запуске моей службы свойство Localdate имеет значение null:

enter image description here

1 Ответ

3 голосов
/ 25 сентября 2019

Запретить сохранение Изменчивых зависимостей в статических полях, так как это приводит к анти-шаблону Ambient Context :

AnКонтекст окружения предоставляет код приложения вне корня композиции с глобальным доступом к изменчивой зависимости или ее поведению с использованием статических членов класса.

A Volatile Dependency is:

Зависимость, которая включает побочные эффекты, которые иногда могут быть нежелательны.Это может включать в себя модули, которые еще не существуют или имеют неблагоприятные требования к среде выполнения.Это зависимости, которые рассматриваются DI и скрываются за абстракциями.

Вместо этого есть несколько решений:

  • Внедрение IDateTimeService с использованием Метод Внедрение в статический метод FromService.(см. пример 1)
  • Повышение DateTimeGetter до класса экземпляра и внедрение IDateTimeService с использованием Конструктор Injection в конструктор DateTimeGetter.(см. пример 2)

Пример 1:

public static class DateTimeGetter
{
    public async static Task<DateTime> FromService(
        this DateTime value, IDataTimeService timeProvider)
    {
        return await timeProvider.Get();
    }
}

Пример 2:

public class DateTimeGetter : IDateTimeGetter
{
    private readonly IDataTimeService timeProvider;

    public DateTimeGetter(IDataTimeService timeProvider)
    {
        this.timeProvider = timeProvider ?? throw new ArgumentNullException("timeProvider");
    }

    public async Task<DateTime> FromService(
        DateTime value, IDataTimeService timeProvider)
    {
        return await this.timeProvider.Get();
    }
}

При использовании Внедрение в конструктор ,DateTimeGetter само должно быть введено в его потребителей.

...