Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工联会;通用存储库,具有自定义存储库的可靠原则_C#_Dependency Injection_Repository Pattern_Unit Of Work_Solid Principles - Fatal编程技术网

C# 工联会;通用存储库,具有自定义存储库的可靠原则

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。因此,您需要

我在项目中使用UnitOfWork和Repository模式。我正在努力把代码写干净

这是我的IUnitOfWork.cs(应用层)

如何使用我的
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 ...)
    {
       //
    }