Как подключить / связать несколько реализаций с помощью Ninject? - PullRequest
0 голосов
/ 16 ноября 2011

Я создаю API и хочу предоставить интерфейс под названием IReportFields. Я хочу, чтобы клиент реализовал этот класс и в основном получал поля из любого источника данных (обычно базы данных).

В моем интерфейсе IReport, который я хочувзять экземпляр IReportFields (может быть больше одного, в моем приложении, по крайней мере, 4), затем сделать все, что мне нужно сделать в этом интерфейсе, обычно это будет что-то вроде отчета о сборке или что-то еще.

Так, например:

public interface IReportField
{
 ICollection<ReportField> GetFields();
}

Могут быть поля отчета различного типа, например, они могут быть получены для 3 или 4 разных таблиц базы данных и т. Д.

Затем на моем основном интерфейсеЯ буду:

public interface IReport
{
 string GetReport(IReportField[] field);
}

Вопрос:

IReportFields может иметь несколько реализаций, то есть много разных типов полей, как мне вызвать метод GetReport помня, что я использую Ninject , как мне соединить мои интерфейсы?

// этот бит, где я застрял, как я передаю в параметрах as Я не хочу жесткой зависимости от класса, который требует от меня получения отчета

 IFieldReport field1 = new FieldImp1();
 IFieldReport field2 = new FieldImp2();

 var report = GetReport(feild1, field2);

1 Ответ

1 голос
/ 16 ноября 2011

Вы можете использовать Constructor инъекцию, чтобы все подключить IFieldReports, например, если у вас есть проводка следующим образом:

IKernel kernel = new StandardKernel();

kernel.Bind<IReportField>().To<FieldImp1>();
kernel.Bind<IReportField>().To<FieldImp2>();
kernel.Bind<IReport>().To<ReportImpl>();

И у вас есть ReportImpl, например:

public class ReportImpl : IReport
{
    public ReportImpl(List<IReportField> fieldReports)
    {
        // you now have all the wires to IReportField in fieldReports parameter
        foreach(IReportField fieldReport in fieldReports)
        {
            var fields = fieldReport.GetFields();
            // do whatever with the fields
        }
    }
}

Пожалуйста, дайте мне знать, если я ошибся

...