很难说没有看到一些代码,但你可能想要考虑实施一个存储库模式。 Repository实现将负责检索工厂用于构建其对象的数据。你可以注入仓库接口到你的工厂:
public class ModelParameterFactory : IModelParameterFactory
{
private readonly IModelParameterRepository Repository;
public ModelParameterFactory(IModelParameterRepository repository)
{
Repository = repository;
}
...interface methods use the injected repository...
}
然后你会的,说DatabaseModelParameterRepository和FileModelParameterRepository。但我猜你也有周围那些你将需要注入的逻辑,这样要求另一家工厂:
public class ModelParameterRepositoryFactory : IModelParameterRepositoryFactory
{
public ModelParameterRepositoryFactory(...inputs needed to determine which repository to use...)
{
...assign...
}
...determine which repository is required and return it...
}
在这一点上,它可能会更有意义注入IModelParameterRepositoryFactory到ModelParameterFactory,而比注入IModelParameterRepository。
public class ModelParameterFactory : IModelParameterFactory
{
private readonly IModelParameterRepositoryFactory RepositoryFactory;
public ModelParameterFactory(IModelParameterRepositoryFactory repositoryFactory)
{
RepositoryFactory = repositoryFactory;
}
...interface methods get repository from the factory...
}
无论您使用DI容器与否,对采用何种存储库,并利用其工厂现已搬进了相关工厂实现,而不是调用代码或DI配置的所有逻辑。
虽然不是非常复杂,但这种设计让我停下来想知道您的ModelParameterFactory和ModelParameters是否过于通用。你可以从嘲笑他们到单独的,更具体的课堂中受益。结果将是一个更简单,更具表现力的设计。但是,如果情况并非如此,以上应该适用于您。