c# – 通用存储库和事务

c# – 通用存储库和事务,第1张

概述我在MVC应用程序中实现了我的第一个Generic存储库.工作正常,但如何将存储库放在事务范围? public interface IRepository<TEntity> where TEntity : class { List<TEntity> FetchAll(); IQueryable<TEntity> Query { get; } 我在MVC应用程序中实现了我的第一个Generic存储库.工作正常,但如何将存储库放在事务范围?
public interface IRepository<TEntity> where TEntity : class    {        List<TEntity> FetchAll();        Iqueryable<TEntity> query { get; }        voID Add(TEntity entity);        voID Delete(TEntity entity);        voID Save();    }    public class Repository<T> : IRepository<T> where T : class    {        private Readonly DataContext _db;        public Repository(DataContext db)        {            _db = db;        }        #region IRepository<T> Members        public Iqueryable<T> query        {            get { return _db.Gettable<T>(); }        }        public List<T> FetchAll()        {            return query.ToList();        }        public voID Add(T entity)        {            _db.Gettable<T>().InsertOnsubmit(entity);        }        public voID Delete(T entity)        {            _db.Gettable<T>().DeleteOnsubmit(entity);        }        public voID Save()        {            _db.submitChanges();        }        #endregion    }        private voID RegisterDependencyResolver()        {            var kernel = new StandardKernel();                     var connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;            kernel.Bind(typeof(DataContext)).ToMethod(context => new DataContext(connectionString));            kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));                        DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));        }    public class adminController : Controller    {        private Readonly IRepository<User> _userRepository;        private Readonly IRepository<Order> _orderRepository;public adminController(IRepository<User> userRepository,IRepository<Order> orderRepository)        {            _userRepository = userRepository;            _orderRepository = orderRepository;        } public ActionResult InsertUser(Userviewmodel model)        {//Skip Code//Do not commit data to database if _orderRepository is Failed to save data       _userRepository.Add(user);            _userRepository.Save();//Skip Code      _orderRepository.Add(order);            _orderRepository.Save();}}

在InsertUser *** 作中使用Transaction作用域包装存储库代码的最佳方法是什么?

解决方法 你在这里错过了一个抽象.您应该将所有业务逻辑放在命令处理程序中,并创建一个实现事务行为的命令处理程序装饰器. This article描述了如何做到这一点,但简而言之:

>定义ICommandHandler< TCommand>接口:

public interface ICommandHandler<TCommand>{    voID Handle(TCommand command);}

>创建定义业务 *** 作合同的命令.命令只是DTOs(只有数据,没有行为).例如:

public class ShipOrderCommand{    public int OrderID { get; set; }    public ShipPingInfo Info { get; set; }}

>实现将包含这些命令的业务逻辑/行为的命令处理程序:

public class ShipOrderCommandHandler     : ICommandHandler<ShipOrderCommand>{    private Readonly IRepository<Order> repository;    public ShipOrderCommandHandler(        IRepository<Order> repository)    {        this.repository = repository;    }    public voID Handle(ShipOrderCommand command)    {        // do some useful stuf with the command and repository.    }}

>让你的MVC控制器依赖于ICommandHandler< T>抽象:

public ShipOrderController : Controller{    private Readonly ICommandHandler<ShipOrderCommand> handler;    public ShipOrderController(        ICommandHandler<ShipOrderCommand> handler)    {        this.handler = handler;    }    public voID Ship(int orderID,ShipPingInfo info)    {        this.handler.Handle(new ShipOrderCommand        {            OrderID = orderID,Info = info        });    }}

>定义实现事务逻辑的通用装饰器:

public TransactionalCommandHandlerDecorator<TCommand>    : ICommandHandler<TCommand>{    private ICommandHandler<TCommand> decoratedHandler;    public TransactionalCommandHandlerDecorator(        ICommandHandler<TCommand> decoratedHandler)    {        this.decoratedHandler = decoratedHandler;    }    public voID Handle(TCommand command)    {        using (var scope = new TransactionScope())        {            this.decoratedHandler.Handle(command);            scope.Complete();        }    }}

>确保每个ShipOrderCommandHandler都使用TransactionalCommandHandlerDecorator进行修饰并注入ShipOrderController.您可以使用您喜欢的DI容器或手动执行此 *** 作:

protected overrIDe IController GetControllerInstance(    RequestContext requestContext,Type controllerType){    if (controllerType == typeof(ShipOrderController))    {        return new ShipOrderController(            new TransactionalCommandHandlerDecorator<ShipOrderCommand>(                new ShipOrderCommandHandler(                    new OrderRepository())));    }    return base.GetControllerInstance(requestContext,controllerType);}

有了这个,您就可以在事务中运行所有业务逻辑,而无需业务逻辑了解这一点.

总结

以上是内存溢出为你收集整理的c# – 通用存储库和事务全部内容,希望文章能够帮你解决c# – 通用存储库和事务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1249500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存