namespace RepositorySample.BLL{ public class User { // Constructor public User(Guid userID) { #region Require if (userID == Guid.Empty) throw new ArgumentNullException(); #endregion } // Properties public Guid UserID { get; set; } public string Name { get; set; } public bool IsMen { get; set; } }}
接着建立提供BLL层数据进出的边界对象,UserRepository对象及IUserRepositoryProvider接口。(这边要特别说明的是,也可以直接建立IUserRepository接口当作BLL层数据进出的边界对象。之所以建立UserRepository对象及IUserRepositoryProvider接口,这种组合式的边界对象,只是架构设计的个人习惯,笔者比较不喜欢使用接口让架构内部直接使用。)
namespace RepositorySample.BLL{ public class UserRepository { // Fields private readonly IUserRepositoryProvider _userRepositoryProvider = null; // Constructor public UserRepository(IUserRepositoryProvider userRepositoryProvider) { #region Require if (userRepositoryProvider == null) throw new ArgumentNullException(); #endregion _userRepositoryProvider = userRepositoryProvider; } // Methods public IEnumerable<User> QueryAll() { return _userRepositoryProvider.QueryAll(); } }}
namespace RepositorySample.BLL{ public interface IUserRepositoryProvider { // Methods IEnumerable<User> QueryAll(); }}
接着建立BLL层最后一个对象,也就是真正提供计算人员数量服务的对象UserCountService。
namespace RepositorySample.BLL{ public class UserCountService { // Fields private readonly UserRepository _userRepository = null; // Constructor public UserCountService(UserRepository userRepository) { #region Require if (userRepository == null) throw new ArgumentNullException(); #endregion _userRepository = userRepository; } // Methods public int GetAllCount() { return _userRepository.QueryAll().Count(); } public int GetMenCount() { int menCount = 0; foreach (User user in _userRepository.QueryAll()) { if (user.IsMen == true) { menCount++; } } return menCount; } }}
再来建立RepositorySample.DAL项目,以及存取Sql数据库的DAL对象SqlUserRepositoryProvider。(因为是仿真范例就不实做查询数据库,改用直接建立的方式来示意。)
namespace RepositorySample.DAL{ public class SqlUserRepositoryProvider : IUserRepositoryProvider { // Methods public IEnumerable<User> QueryAll() { User user = null; List<User> userList = new List<User>(); user = new User(Guid.NewGuid()); user.Name = "Clark"; user.IsMen = true; userList.Add(user); user = new User(Guid.NewGuid()); user.Name = "Jane"; user.IsMen = false; userList.Add(user); return userList; } }}
最后剩下的就是建立一个Console项目,来使用UserCountService。这个Console项目里,会生成UserCountService,并且打印的人员数量。(因为是仿真范例,UserCountService的生成,采用直接建立的方式来示意。实际项目可以采用各种IoC Framework来做生成注入的动作,避免Console项目与DAL项目有高度的耦合。)
namespace RepositorySample.DAL{ public class CsvUserRepositoryProvider : IUserRepositoryProvider { // Methods public IEnumerable<User> QueryAll() { User user = null; List<User> userList = new List<User>(); user = new User(Guid.NewGuid()); user.Name = "Jeff"; user.IsMen = true; userList.Add(user); return userList; } }}
接着因为范例没有采用IoC Framework来做生成注入,所以必须手动修改生成注入这个工作。
static UserCountService CreateUserCountService(){ // UserRepositoryProvider CsvUserRepositoryProvider userRepositoryProvider = new CsvUserRepositoryProvider(); // UserRepository UserRepository userRepository = new UserRepository(userRepositoryProvider); // UserCountService UserCountService userCountService = new UserCountService(userRepository); // Return return userCountService;}
最后看看运行结果,可以发现计算出来的人员数量,是以CsvUserRepositoryProvider提供的资料来做计算。