在不依赖 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();
}
}
或者类似的东西。
我有一个 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();
}
}
或者类似的东西。