0

我正在我的一个基于 ASP.NET MVC4 和 N 层架构的项目中实现存储库模式。对于如何使用存储库模式实现自定义成员资格,我有点困惑。到目前为止,这是我实现课程的方式。

//通用存储库

public interface IRepository<T> where T : class
{
void Add(T entity);
void Delete(T entity);
void Update(T entity);
IQueryable<T> GetAll();
T FindBy(Expression<Func<T, bool>> expression);
IQueryable<T> FilterBy(Expression<Func<T, bool>> expression);
}

//存储库基类

public abstract class Repository<T> : IRepository<T> where T : class
{
private STNDataContext _stnDataContext;
private readonly IDbSet<T> _dbSet;

protected Repository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
_dbSet = StnDataContext.Set<T>();
}

protected IDatabaseFactory DatabaseFactory { get; private set; }
public STNDataContext StnDataContext
{
get { return _stnDataContext ?? (_stnDataContext = new STNDataContext()); }
}
public void Add(T entity)
{
_dbSet.Add(entity);
_stnDataContext.Commit();
}

public void Delete(T entity)
{
_dbSet.Remove(entity);
}

public void Update(T entity)
{
_dbSet.Attach(entity);
_stnDataContext.Entry(entity).State = EntityState.Modified;
_stnDataContext.Commit();
}

public IQueryable<T> GetAll()
{
return _dbSet.ToList().AsQueryable();
}

public T FindBy(Expression<Func<T, bool>> expression)
{
return FilterBy(expression).SingleOrDefault();
}

public IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
{
return GetAll().Where(expression).AsQueryable();
}

//用户存储接口

public interface IUserRepository : IRepository<User>
{
}

//用户存储库

public class UserRepository : Repository<User>, IUserRepository
{
public UserRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
}
}

//这是我的业务逻辑层

//通用服务接口

public interface IService<T>
{
void Add(T entity);
void Delete(T entity);
void Update(T entity);
IEnumerable<T> GetAll();
T FindBy(Expression<Func<T, bool>> expression);
IEnumerable<T> FilterBy(Expression<Func<T, bool>> expression);
}

//服务基地

public class Service<T> : IService<T> where T : class 
{
public void Add(T entity)
{
throw new NotImplementedException();
}

public void Delete(T entity)
{
throw new NotImplementedException();
}

public void Update(T entity)
{
throw new NotImplementedException();
}

public IEnumerable<T> GetAll()
{
throw new NotImplementedException();
}

public T FindBy(Expression<Func<T, bool>> expression)
{
throw new NotImplementedException();
}

public IEnumerable<T> FilterBy(Expression<Func<T, bool>> expression)
{
throw new NotImplementedException();
}
}

//用户服务接口

public interface IUserService : IService<User>
{
}

//用户服务实现

public class UserService : Service<User>, IUserService
{
private readonly IUserRepository _userRepository;
private readonly IRoleRepository _roleRepository;

public UserService(IUserRepository userRepository, IRoleRepository roleRepository)
{
_userRepository = userRepository;
_roleRepository = roleRepository;
}

public IList<User> GetAllUsers()
{
return _userRepository.GetAll().ToList();
}

public User GetUser(int id)
{
return _userRepository.FindBy(x => x.UserId == id);
}

public User GetUser(string userName)
{
return _userRepository.FindBy(x => x.Username.Equals(userName));
}

public void CreatUser(User user)
{
_userRepository.Add(user);
}

public IList<User> GetUsersForRole(string roleName)
{
return _userRepository.FilterBy(x => x.Role.RoleName.Equals(roleName)).ToList<User>();
}

public IList<User> GetUsersForRole(int roleId)
{
return _userRepository.FilterBy(x => x.Role.RoleId == roleId).ToList<User>();
}

public IList<User> GetUsersForRole(Role role)
{
return GetUsersForRole(role.RoleId);
}

}

我不太确定我走对了吗?如果是,我如何实现我的 UserService 类。

如果不是,我需要实施哪些更改。

对此的任何帮助都是非常可观的。在此先感谢*强文本*

4

1 回答 1

0

你的界面IService<T>看起来非常像你的IRepository<T>界面。对我来说,这看起来像是一个完全无用的抽象。消费者可以IRepository<T>直接使用抽象。如果您的意图是向实现添加功能(例如横切关注点)IService<T>;改用装饰器

此外,为什么有一个空的(非通用的)IUserRepository?直接使用没有用IRepository<User>。如果您打算IUserRepository稍后为此添加额外的方法,请不要。这个接口,以及这个接口的实现,将开始变得太大,变得难以维护,并且变得难以扩展你的代码库的一部分,因为你将违反单一职责原则。相反,为自定义用户特定操作提供自己的类(每个操作一个类),由通用接口隐藏,就像您已经对IRepository<T>.

以下两篇文章描述了一种通过定义更小的重点类来创建更可维护的系统的有吸引力的方法,每个类都封装一个查询或用例,这些类可以放在存储库模式的顶部:

最后一点。您的UserService类看起来很像MembershipProvider.NET 框架中的类。为什么不使用那个类?有一个非常有趣的库,它允许您以更结构化、对依赖项友好的方式为 MVC 创建成员资格提供程序。你一定要看看。

于 2012-10-29T10:46:12.730 回答