C# 工联会;通用存储库,具有自定义存储库的可靠原则
我在项目中使用UnitOfWork和Repository模式。我正在努力把代码写干净 这是我的IUnitOfWork.cs(应用层) 如何使用我的C# 工联会;通用存储库,具有自定义存储库的可靠原则,c#,dependency-injection,repository-pattern,unit-of-work,solid-principles,C#,Dependency Injection,Repository Pattern,Unit Of Work,Solid Principles,我在项目中使用UnitOfWork和Repository模式。我正在努力把代码写干净 这是我的IUnitOfWork.cs(应用层) 如何使用我的IUnitOfWork访问Test()函数 var result = UnitOfWork.Repository<Entities.Custom>().Test(); // not working 您必须强制转换,因为UnitOfWorkRepository方法返回一个IGenericRepository,它不声明Test。因此,您需要
IUnitOfWork
访问Test()
函数
var result = UnitOfWork.Repository<Entities.Custom>().Test(); // not working
您必须强制转换,因为
UnitOfWork
Repository
方法返回一个IGenericRepository
,它不声明Test
。因此,您需要将返回的值强制转换为ICustomRepository
,该库继承IGenericRepository
,并固定在测试方法上。当强制转换可以工作时(如果存储库不为空),您可以问自己这是否有用;您将依赖于了解其详细信息,即:调用方现在知道它实际上是一个非泛型接口和类型
,即ICustomRepository
(顺便说一句,您获得null ref
的原因可能是因为UnitOfWork
只创建generic
存储库,而您的自定义repo不存在)
更好(IMO)和更明确的方式来设计您的工作单元
不是以通用
方式,而是列出所有存储库:
public interface IUnitOfWork : IDisposable
{
int Save();
ICustomRepository CustomRepository {get;}
IGenericRepository<Entities.Example> ExampleRepository {get;}
// etc...
}
只需确保在您的工作单元中使用与注入到存储库中的实例相同的DbContext
。HierarchyCallifeTimeManager…这不是Prism,是吗?如果是这样,请帮自己一个忙,使用像Autofac这样的真正DI框架。仅供参考,EF DbContext已经是一个工作单元。只需创建一个在使用块中,它就完成了。老实说,这在我看来有点错误。为什么不利用Ef core dbcontext来处理工作单元呢?考虑到可以利用已经存在的东西,我觉得没有必要创建整个层次结构。一些最好的工程涉及不必要地编写代码我的ORM可以是EF或Ado.net或其他类型。我使用(UnitOfWork.Repository()作为ICustomRepository)获取NullReferenceException:(您需要一些注册表,以便映射tenty
到右侧IGenericRepository
使其工作。一些DI框架可以是这样的注册表,但您当然可以自己做。
public interface IGenericRepository<TEntity>
where TEntity : class
{
void Update(TEntity entity);
void Delete(object id);
void InsertList(IEnumerable<TEntity> entities);
// etc..
}
var result = UnitOfWork.Repository<Entities.Example>().Delete(id);
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager())
public interface ICustomRepository: IGenericRepository<Entities.Custom>
{
void Test();
}
var result = UnitOfWork.Repository<Entities.Custom>().Test(); // not working
(UnitOfWork.Repository<Entities.Custom>() as ICustomRepository).Test();
System.NullReferenceException: 'Object reference not set to an instance of an object.'
public interface IUnitOfWork : IDisposable
{
int Save();
ICustomRepository CustomRepository {get;}
IGenericRepository<Entities.Example> ExampleRepository {get;}
// etc...
}
public UnitOfWork(DBContext context, ICustomRepository customRepository ...)
{
//
}