如何在方法调用中传递或注入未知数量的对象
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;
}
如何传递、注入或实例化一个对象的一个或多个实例,而我只引用了它的接口?
我不确定我问的是否正确,这是我的简单伪代码问题。
在此示例中,这是一个数据层,可以访问对包含公共接口但不包含具体实现的项目的引用。我想传入(或注入)列表,该列表将 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;
}