Interface 在工厂实现中处理状态

Interface 在工厂实现中处理状态,interface,dependency-injection,factory-pattern,Interface,Dependency Injection,Factory Pattern,如果您有多个工厂实现,每个工厂实现都需要不同的状态信息来创建新对象,那么您会使用什么模式 例如: IModelParameters:包含复杂计算的所有输入和输出 IModelParameterFactory:具有获取和保存IModelParameter对象的方法 问题是,一个工厂实现可能是从数据库获取参数,并带有检索所需的某些状态(即用户ID),另一个工厂实现可能是从文件获取输入,在这种情况下,您没有用户ID,但确实需要文件名 在这种情况下,还有其他模式更有效吗?我看过一些依赖注入工具/库,但没

如果您有多个工厂实现,每个工厂实现都需要不同的状态信息来创建新对象,那么您会使用什么模式

例如: IModelParameters:包含复杂计算的所有输入和输出 IModelParameterFactory:具有获取和保存IModelParameter对象的方法

问题是,一个工厂实现可能是从数据库获取参数,并带有检索所需的某些状态(即用户ID),另一个工厂实现可能是从文件获取输入,在这种情况下,您没有用户ID,但确实需要文件名


在这种情况下,还有其他模式更有效吗?我看过一些依赖注入工具/库,但没有看到任何能解决这种情况的东西。

你有没有试着把需求放在一个类中

每个工厂实现都有自己的Requements,但所有Requements类都派生自一个基本Requements类(或Requements接口)。这允许您对所有工厂实现使用相同的接口,您只需在每个工厂实现中对正确的Requerients类进行转换


是的,强制转换很难看而且容易出错,但是这种方法为您的工厂提供了一个统一的可扩展接口。

很难说没有看到一些代码,但是您可能需要研究如何实现存储库模式。存储库实现将负责检索工厂用于构建其对象的数据。您可以将存储库接口注入工厂:

public class ModelParameterFactory : IModelParameterFactory
{
    private readonly IModelParameterRepository Repository;

    public ModelParameterFactory(IModelParameterRepository repository)
    {
        Repository = repository;
    }

    ...interface methods use the injected repository...
}
public class ModelParameterRepositoryFactory : IModelParameterRepositoryFactory
{
    public ModelParameterRepositoryFactory(...inputs needed to determine which repository to use...)
    {
        ...assign...
    }
    ...determine which repository is required and return it...
}
然后,假设您有一个DatabaseModelParameterRepository和一个FileModelParameterRepository。但我猜你也有逻辑,你需要注射哪些药物,因此需要另一家工厂:

public class ModelParameterFactory : IModelParameterFactory
{
    private readonly IModelParameterRepository Repository;

    public ModelParameterFactory(IModelParameterRepository repository)
    {
        Repository = repository;
    }

    ...interface methods use the injected repository...
}
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是否过于通用。将它们划分为单独的、更具体的类可能会使您受益。结果将是一个更简单和更具表现力的设计。但是,如果不是这样的话,上述方法应该适用于您。

在我看来,状态是存储在内存中的东西,例如静态对象、全局变量、缓存或会话。通常在DI中,这些状态不被维护,而是作为参数传递。例如:

public IEnumerable<Records> GetRecordByUserId(string userId){ /*code*/ }
public IEnumerable GetRecordByUserId(字符串userId){/*code*/}
用户ID正在传递,而不是在存储库中维护

然而,当您希望使它们像配置一样,而不是每次执行查询时都传递它们时,我认为您可以将其作为包装器类注入。有关更多信息,请参阅我的。不过,我不建议在存储库中使用这种设计,但我建议在服务级别使用这种设计