如何在方法调用中传递或注入未知数量的对象

How to Pass or Inject an Unknown Number of Objects in a Method Call

如何传递、注入或实例化一个对象的一个​​或多个实例,而我只引用了它的接口?

我不确定我问的是否正确,这是我的简单伪代码问题。

在此示例中,这是一个数据层,可以访问对包含公共接口但不包含具体实现的项目的引用。我想传入(或注入)列表,该列表将 return 一个或多个提供者对象的集合。

问题是,我无法为存储过程 return 集合中的每条记录实例化 IProvider 项的新实例,因为我只引用了 IProvider界面。

DI会解决这个问题吗?我仍然不知道要传入多少个 Provider 项目实例,如果在我调用此方法时有的话。

我感觉这是一个模式问题,但我想不出正确的解决方案。

    public List<IProvider> GetProviders(List<IProvider> providers, IProvider provider)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "Providers.usp_GetProviders";

        SQLDatabase db = new SQLDatabase();

        using(cmd.Connection = db.GetConnection())
        {

            cmd.Connection.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            if (rdr.HasRows)
            {
                // Internal private method called for each row
                // needs a new instance of an IProvider
                MapDbToEntity(rdr, provider);
                providers.Add(provider);
            }
        }

        return providers;
    }

我认为解决这个问题的正确方法是使用工厂模式。

实现接口以创建对象的工厂被注入到较低的数据层,该数据层对实体一无所知,只知道接口。

我无论如何都不是模式专家,所以我正在寻找确认 - 但是这确实有效。

保持简单:

namespace MyApplication.Common.Factory
{
    public interface IFactory
    {
        IProvider GetProvider();
    }
}

然后,在我的业务实体层:

public class ProviderFactory : IFactory
{
    public IProvider GetProvider()
    {
        return new Provider();
    }

}

这又允许我调用和调用工厂来创建一个实现 IProvider 接口的对象的实例:

    public List<IProvider> GetProviders(List<IProvider> providers, IFactory factory)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "Providers.usp_GetProviders";

        SQLDatabase db = new SQLDatabase();

        using(cmd.Connection = db.GetConnection())
        {

            cmd.Connection.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            if (rdr.HasRows)
            {
                IProvider provider = factory.GetProvider();

                MapDbToEntity(rdr, provider);
                providers.Add(provider);
            }
        }

        return providers;
    }