如何使用Ninject连接/绑定多个实现?

时间:2011-11-16 10:36:34

标签: api dependency-injection c#-3.0 ninject

我正在创建一个API,我希望公开一个名为IReportFields的接口,我希望客户端实现这个类,并且基本上从任何数据源(通常是数据库)获取字段。

在我的IReport界面中,我想要接收一个IReportFields的实例(可能不止一个,在我的应用程序中我至少有4个),然后在该界面中做我需要做的任何事情,通常它会是比如建立报告或其他什么。

例如:

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

可能存在各种类型的报告字段,例如他们可以派出3或4个不同的数据库表等...

然后在我的主界面上我会:

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

问题:

IReportFields 可以有多个实现,即许多不同类型的字段,我如何调用 GetReport 方法,记住我正在使用 Ninject ,如何将界面连接在一起?

//这一点是我陷入困境的地方,我如何传递参数,因为我不希望对需要我获取报告

的类强烈依赖
 IFieldReport field1 = new FieldImp1();
 IFieldReport field2 = new FieldImp2();

 var report = GetReport(feild1, field2);

1 个答案:

答案 0 :(得分:1)

您可以使用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
        }
    }
}

如果我弄错了,请告诉我