Nano Hash - криптовалюты, майнинг, программирование

Внедрение зависимостей в сочетании с универсальным

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

public interface IReader<TParameter, TOutput>
{
     TOutput Read(TParameter parameter);
}

public class Customer : IReader<int, CustomerModel>
{
     public CustomerModel Read(int parameter)
     {      
          // Implementation...
     }
}

Проблема возникает, когда вы пытаетесь использовать внедрение зависимостей. Я попытался:

public class Reader<TParameter, TOutput>
{
     private IReader<TParameter, TOutput> reader;
     public Reader(IReader<TParameter, TOutput> reader)
     {
          // Link through Constructor... 
     }
}

Это не работает, но как на данном этапе можно реализовать и выполнить внедрение зависимостей, когда на этом уровне задействован общий объект? Это вообще возможно?


  • Какой контейнер IoC вы используете? Я знаю, что для Unity вы должны иметь возможность использовать container.RegisterType<IReader<TParameter, TOutput>, Customer>() другие фреймворки, которые могут быть более ограниченными. 12.01.2015
  • @Jarga На данный момент нет, хотел сначала попробовать простую предпосылку без IoC Framework. 12.01.2015
  • Посмотрите, отвечает ли эта ссылка на ваш вопрос: stackoverflow.com/questions/700966/ универсальный-тип-в-конструкторе [1]: 12.01.2015
  • Я допустил ошибку в комментарии выше, вам нужно было бы сделать container.RegisterType<IReader<int, CustomerModel>, Customer>() в Unity. В любом случае, если вы создаете свой собственный, вы должны иметь возможность сопоставлять typeIReader<int, CustomerModel> так же, как и другие типы интерфейсов. 12.01.2015
  • Извините, но я честно пытаюсь понять проблему здесь. Для начала может быть полезно переименовать классы. Клиент, который реализует IReader, и Reader, который зависит от IReader, но не реализует его?! Я бы предложил переименовать Customer в CustomerReader (действительно ли он читает объект клиента или просто создает модель с заданным целым числом?) И когда вы говорите, что это не работает, в чем проблема, с которой вы сталкиваетесь с этими классами? 12.01.2015
  • Ваша проблема, похоже, больше связана с вашим пониманием дженериков, чем с дженериками с DI. В большинстве сред DI есть механизмы для использования дженериков, и использовать дженерики с DI для бедняков тривиально, но проблема в вашем примере заключается в том, что ваш синтаксис не работает. См. пример Джейсона. 12.01.2015
  • @ErikFunkenbusch Я знаю, что синтаксис не работает, я пытаюсь ознакомиться с таким разъяснением подхода, было бы потрясающе. 12.01.2015

Ответы:


1

Я согласен с некоторыми комментариями о том, что без инфраструктуры IOC или достаточного количества настраиваемого отражения вы не получите многого от DI с простым .NET для дженериков, подобных этой ситуации. Шаблон, который вы, кажется, описываете, представляет собой шаблон Proxy с последним классом Reader, который инкапсулирует интерфейс.

Переименовав последний класс ReaderProxy для ясности, я попытался продвинуть ваш код на шаг вперед, надеясь показать, как внедрение зависимостей может быть выполнено без фреймворка или пользовательской инициализации универсальных объектов, которые могут упростить фактические строки инициализации.

В приведенном ниже коде показано, как можно использовать внедрение зависимостей (см. fiddle: https://dotnetfiddle.net/cfNCyl) .

var reader = new ReaderProxy<int, CustomerModel>(new Customer());
var model = reader.Read(5);
Console.WriteLine(model.Id);

А вот классы и интерфейсы, необходимые для приведенного выше кода (включая простую модель CustomerModel):

public interface IReader<TParameter, TOutput>
{
     TOutput Read(TParameter parameter);
}

public class Customer : IReader<int, CustomerModel>
{
     public CustomerModel Read(int parameter)
     {      
         return new CustomerModel() { Id = parameter };
     }
}

public class CustomerModel
{
    public int Id { get; set; }
}

public class ReaderProxy<TParameter, TOutput>
    : IReader<TParameter, TOutput>
{
    private IReader<TParameter, TOutput> reader;
    public ReaderProxy(IReader<TParameter, TOutput> reader)
    {
          this.reader = reader;
    }
    public TOutput Read(TParameter parameter)
    {
        return this.reader.Read(parameter);
    }
}
12.01.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..