提问者:小点点

UnitOfWork&通用存储库,具有自定义存储库的坚实原则


我正在项目中使用UnitOfWork和Repository模式。 我在试着把代码弄干净。

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

public interface IUnitOfWork : IDisposable
{
    int Save();
    IGenericRepository<TEntity> Repository<TEntity>() where TEntity : class;
}

实现单元OfWork.cs:(持久层)

public class UnitOfWork : IUnitOfWork
{      
    private readonly DBContext _context;
    private Hashtable _repositories;
    public UnitOfWork(DBContext context)
    {
        _context = context;
    }

    public IGenericRepository<T> Repository<T>() where T : class
    {
        if (_repositories == null)
            _repositories = new Hashtable();

        var type = typeof(T).Name;

        if (!_repositories.ContainsKey(type))
        {
            var repositoryType = typeof(GenericRepository<>);

            var repositoryInstance =
                Activator.CreateInstance(repositoryType
                    .MakeGenericType(typeof(T)), _context);

            _repositories.Add(type, repositoryInstance);
        }

        return (IGenericRepository<T>)_repositories[type];
    }

    public int Save()
    {
        // Save changes with the default options
        return _context.SaveChanges();
    }

    // etc.. Dispose()
}

我的iGenericRepository.cs:(应用程序层)

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);

并且使用Unity,我将依赖性注入容器中。

  container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager())

它就像一个符咒。

现在我有了一个自定义存储库ICustomRepository:

public interface ICustomRepository: IGenericRepository<Entities.Custom>
{
    void Test();
}

如何使用我的IUnitOfWork访问test()函数?

var result = UnitOfWork.Repository<Entities.Custom>().Test();  // not working

更新:

@Thomas Cook给我一个使用cast的方法:

   (UnitOfWork.Repository<Entities.Custom>() as ICustomRepository).Test();

我得到一个NullReferenceException:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

共1个答案

匿名用户

您必须强制转换,因为UnitOfWorkRepository方法返回一个IgEnericRepository,该方法不声明Test。 因此,您需要将返回的值强制转换为ICustomRepository,它继承IGenericRepository并在Test方法上绑定。