代码已托管在 https://code.csdn.net/denghao156/ktnmb_mvc4
先上图,设计模式参考:ddmvc4.codeplex.com
public UnitOfWork() : base("name=EntitiesDb") { this.Configuration.ProxyCreationEnabled = true; this.Configuration.LazyLoadingEnabled = true; } public void Commit() { base.SaveChanges(); } public void CommitAndRefreshChanges() { bool saveFailed = false; do { try { base.SaveChanges(); saveFailed = false; } catch (DbUpdateConcurrencyException ex) { saveFailed = true; ex.Entries.ToList() .ForEach(entry => { entry.OriginalValues.SetValues(entry.GetDatabaseValues()); }); } } while (saveFailed); } public void RollbackChanges() { base.ChangeTracker.Entries() .ToList() .ForEach(entry => entry.State = EntityState.Unchanged); }View Code
1.2: Kt.DAL
基础仓储类对UnitOfWork 的引用来实现多个表实体的统一操作。
public class Repository<T> : IRepository<T> where T : class { #region Members IQueryableUnitOfWork _UnitOfWork; #endregion #region Constructor /// <summary> /// 创建仓储实例 /// </summary> /// <param name="unitOfWork">Associated Unit Of Work</param> public Repository(IQueryableUnitOfWork unitOfWork) { if (unitOfWork == (IUnitOfWork)null) throw new ArgumentNullException("unitOfWork"); _UnitOfWork = unitOfWork; }View Code
1.3:Kt.Respository
User 表仓储类。
public class UserRepository : Repository<User>, IUserRepository { public UserRepository(UnitOfWork unitOfWork) : base(unitOfWork) { } }View Code
1.4:Kt.Service
User 表类的业务层的实现
public class UserService : IUserService { private readonly IUserRepository _userRepository; public UserService(IUserRepository userRepository) { this._userRepository = userRepository; } public UserDto GetUserById(int id) { return KtMapper.CreateMap<User, UserDto>(_userRepository.Get(id)); } public void AddUser(UserDto userDto) { User user = KtMapper.CreateMap<UserDto, User>(userDto); _userRepository.Add(user); _userRepository.UnitOfWork.Commit(); }View Code
二、Castle Windsor DI MVC控制器依赖注入
1.1、Kt.Web
创建注入工厂
/// <summary> /// 依赖注入工厂 /// </summary> public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKernel kernel; public WindsorControllerFactory(IKernel kernel) { this.kernel = kernel; } public override void ReleaseController(IController controller) { kernel.ReleaseComponent(controller); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if (controllerType == null) { throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path)); } return (IController)kernel.Resolve(controllerType); } }View Code
1.2、 Dependency 注入容器
public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register(Classes.FromThisAssembly() .BasedOn<IController>() .LifestyleTransient()); container.Register( Component.For<IQueryableUnitOfWork, UnitOfWork>().ImplementedBy<UnitOfWork>(), Component.For<IUserRepository, UserRepository>().ImplementedBy<UserRepository>(), Component.For<IUserService>().ImplementedBy<UserService>(), AllTypes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient() ) .AddFacility<LoggingFacility>(f => f.UseLog4Net()); LoggerFactory.SetCurrent(new TraceSourceLogFactory()); EntityValidatorFactory.SetCurrent(new DataAnnotationsEntityValidatorFactory()); }View Code
1.3、MvcApplication 应用程序启动时控制器的依赖注入容器的实现
public class MvcApplication : System.Web.HttpApplication { private readonly IWindsorContainer container; public MvcApplication() { this.container = new WindsorContainer().Install(new Dependency.Dependency()); } public override void Dispose() { this.container.Dispose(); base.Dispose(); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); var controllerFactory = new WindsorControllerFactory(container.Kernel); ControllerBuilder.Current.SetControllerFactory(controllerFactory); } }View Code
具体代码的实现见框架源代码:https://code.csdn.net/denghao156/ktnmb_mvc4
预计用的工具有:
本节参见大神所写,日后想自己做一个商城出来,代码持续更新到 code.csdn.net ……