在不依赖 DI 容器的情况下动态获取存储库的方法

Way to dynamically get repositories without a dependency on a DI container

我有一个 class returns 一个使用通用方法的存储库(只读)这是为了减少存储库的数量 class 我需要注入 classes 在我的业务层。它还允许我在任何有这个包装器 class 的地方添加和使用新的回购协议,只需添加一个实现 IGenericReadRepo<T> 的回购协议,因为这将使用行 Container.RegisterType(typeof(IGenericReadRepository<>), typeof(GenericReadRepository<>), new TransientLifetimeManager()); 统一注册。然而,这取决于作为 DI 容器的统一性。这闻起来我。

public class ReadRepositoryWrapper : IReadRepositoryWrapper
{
    private IUnityContainer _unityContainer;

    public ReadRepositoryWrapper(IUnityContainer container)
    {
        _unityContainer = container;
    }

    public IGenericReadRepository<T> GetReadRepository<T>() where T : class
    {
         return _unityContainer.Resolve<IGenericReadRepository<T>>();
    }
}

任何人都可以想出一种方法来实现 GetReadRepository<T> 而不依赖于统一性,同时又不引入任何新的依赖项。或者有人可以想出另一种方法来获取存储库,而无需使用臃肿的构造函数或依赖于我的上下文。

您可以创建通用工厂 interfaces/classes 来创建动态对象。许多 DI 容器支持使用 lambda 表达式创建对象。

public interface IFactory<T>
{
  T Create();
}

public class Factory<T> : IFactory<T>
{
  private readonly Func<T> _creator;

  public Factory(Func<T> creator)
  {
    if(creator == null)
      throw new ArgumentNullException("creator");

    _creator = creator;
  }

  public T Create()
  {
    return _creator();
  }
}

通用工厂接口可以注入到消费 类。

public class ReadRepositoryWrapper<T> : IReadRepositoryWrapper<T> where T : class
{
  private readonly IFactory<IGenericReadRepository<T>> _factory;

  public ReadRepositoryWrapper(IFactory<IGenericReadRepository<T>> factory)
  {
    if(factory == null)
      throw new ArgumentNullException("factory");

    _factory = factory;
  }

  public IGenericReadRepository<T> GetReadRepository()
  {
    return _factory.Create();
  }
}

或者类似的东西。