我在ASP.NET核心上使用C#构建数据服务(此时为RC1)。其目的是获取不同类型的数据请求集合并返回数据存储库对象。然后将此对象转换为JSON并发送到请求页面。
数据来源分为几个类别,在每个类别中,有多种来源可以获得不同速度和可靠性的数据。
我的方法是遵循SOLID原则,因为我知道如何(仍在学习)并使用依赖注入来创建解析请求和返回合并数据所需的对象层次结构。
其中一个具体目标是能够在配置中定义(此时appsettings.json)将注入每个层的数据路由对象和数据适配器对象的集合。数据源可以定期更改,添加新的源,我还需要一个允许模拟测试的系统。
我通过创建在所有情况下统一工作的接口,IDataRouter和IDataAdapter来完成此任务。
我目前面临的挑战是使用ASP.NET核心依赖注入系统(或合适的替代品)根据我的配置文件中引用的具体实现创建IDataRouter和IDataAdapter的枚举。然后将这些注入更高级别的类并用于收集所请求的数据。
以下是一般性细分;
DataService有一个:IDataRouter的许多实例作为IEnumerable。引入IRequests对象(是IEnumerable),并将每个IRequest发送到适当的IDataRouter进行进一步处理。
每个IDataRouter都有一个:IDataAdapter的许多实例作为IEnumerable。每个IDataAdapter都能够处理特定类型的IRequest。
请求从DataService向下移动到DataRouters,然后移到数据来源的DataAdapter。然后,数据将通过链流回,并在转换为JSON并发送给请求者之前合并到DataService级别的一个存储库中。
我的具体问题是如何使用ASP.NET核心DI系统来构建要传递给DataService和DataRouters的IEnumerable和IEnumerable枚举。它们每个都需要包含我在配置文件中指定的具体实现列表。
这是当前的DataService构造函数;
public DataService(IRequests requests, IEnumerable<IDataRouters> routers)
{
_requests = requests;
_routers = routers;
}
这可能会转换为;
public class DataServiceOptions : IDataServiceOptions
{
public IRequests requests { get; set; }
public IEnumerable<IDataRouters> routers { get; set; }
}
public DataService(IOptions<IDataServiceOptions> optionsAccessor)
{
_requests = optionsAccessor.value.requests;
_routers = optionsAccessor.value.routers;
}
需要实现一个非常类似的结构,以便将IEnumerable传递给IDataRouters。每个IDataRouter都需要不同的特定具体IDataAdapter集合。所有这些都需要在可编辑的配置源(文件。)
中指定答案 0 :(得分:0)
也许我误会了。你能不能在工厂做到这一点吗?
创建工厂类:
public class DataRoutersFactory : IDataRoutersFactory
{
private readonly IConfiguration _config;
public DataRoutersFactory(IConfiguration config)
{
_config = config;
}
public IEnumberable<IDataRouters> CreateDataRouters()
{
// TODO:- use whatever logic here to read _config and build the data routers to return.
}
}
然后在您的服务中,而不是注入IEnumerable<IDataRouters>
,而是注入IDataRoutersFactory
,并使用它来获取路由器。
对于单元测试,您可以模拟IDataRoutersFactory
以在测试时返回您想要的任何路由器。