Можно ли смою архитектуру немного улучшить?

Попытаюсь объяснить "на пальцах":

У каждого репозитория имеется свой собственный Provider, который по названию сервера возвращает репозиторий.

Provider'у на вход передается IRepoFactory необходимого репозитория и IConnectionRepostiroy.

Provider по serverName обращается в IConnectionRepostiroy, а далее создается репозиторий IRepoFactory.Create(connectionString).

Таким образом реализован провайдер. С помощью него я хотел скрыть использование фабрик и т п вещей.

А вот так реализуется у меня фабрика:

public class ProjectRepositoryFactory : IProjectRepositoryFactory
{
    private readonly IContextFactoryProvider<InetStatContext> _contextFactoryProviderctory;
    /// <summary>
    /// Конструктор
    /// </summary>
    /// <param name="contextFactoryProviderctory"></param>
    public ProjectRepositoryFactory(IContextFactoryProvider<Context> contextFactoryProviderctory)
    {
        _contextFactoryProviderctory = contextFactoryProviderctory ?? throw new ArgumentNullException(nameof(contextFactoryProviderctory));
    }

    /// <summary>
    /// Создать репозиторий
    /// </summary>
    /// <param name="connectionInfo"></param>
    /// <returns></returns>
    public IProjectRepository Create(ConnectionInfo connectionInfo)
    {
        return new ProjectRepository(_contextFactoryProviderctory.CreateContextFactory(connectionInfo.StatDbConnectString));
    }
}

/// <summary>
/// Провайдер фабрик контекстов
/// </summary>
/// <typeparam name="T"></typeparam>
public class ContextFactoryProvider<T>: IContextFactoryProvider<T> where T: DbContext
{
    /// <summary>
    /// Создать фабрику контекстов
    /// </summary>
    /// <param name="connectionString"></param>
    /// <returns></returns>
    public IContextFactory<T> CreateContextFactory(string connectionString)
    {
        return new ContextFactory<T>(connectionString);
    }
}

В итоге получается, что у каждого репозитория есть своя фабрика, свой провайдер и т д.

Это все работает, но мне кажется, что можно как-то красиво все через дженерики сделать, однако есть беспокойство, что может потеряться гибкость, так как имея сейчас на каждый репозитории свой провайдер и фабрику, я волен делать все, что угодно.


Ответы (0 шт):