Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC中实现存储库模式和unitOfWork的最佳实践_Asp.net Mvc_Entity Framework_Repository Pattern_Unit Of Work - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC中实现存储库模式和unitOfWork的最佳实践

Asp.net mvc 在ASP.NET MVC中实现存储库模式和unitOfWork的最佳实践,asp.net-mvc,entity-framework,repository-pattern,unit-of-work,Asp.net Mvc,Entity Framework,Repository Pattern,Unit Of Work,从过去几天开始,我一直在努力实现存储库模式和UnitOfWork,我相信我已经完成了很好的扩展。我相信有很多方法可以实现这一点,但我感兴趣的是找到最好的方法 我正在使用visual studio 2013以ASP.NET MVC 5编写一个非常简单的示例。我的主要问题是UnitOfWork的实现。是否建议为每个业务关注点使用多个UnitOfWorks以私有方法实现存储库函数,并将公共函数提供给控制器使用 我通过通用存储库在控制器类中拥有函数表(SQL Server)。我有一个IGenericRe

从过去几天开始,我一直在努力实现存储库模式和UnitOfWork,我相信我已经完成了很好的扩展。我相信有很多方法可以实现这一点,但我感兴趣的是找到最好的方法

我正在使用visual studio 2013以ASP.NET MVC 5编写一个非常简单的示例。我的主要问题是UnitOfWork的实现。是否建议为每个业务关注点使用多个UnitOfWorks以私有方法实现存储库函数,并将公共函数提供给控制器使用

我通过通用存储库在控制器类中拥有函数表(SQL Server)。我有一个IGenericRepository,它有一个IQueryable函数,我有一个GenericRepository类,我在其中实现这个接口。我得到了从baseContext继承的FunctionContext。我之所以使用baseContext,是因为所有DBContext都可以使用一条路径访问数据库,但同时将表的数量限制在业务需要的范围内

现在在我的方法中

  • 一个BaseContext:DbContext
  • 多个DbContext,将所有必需的表绑定到扩展BaseContext的单个业务关注点
  • 通用存储库接口(CRUD)
  • 通用存储库实现类
  • 特定存储库类,扩展通用存储库,以防在CRUD操作之上需要更多功能
  • 单个UnitOfWork-->以私有方法访问所需的存储库,并仅为使用函数提供公共方法
  • 控制器调用要求UnitOfWork使用公共方法
  • 在下面的程序中,我将得到函数标题列表,并将其传递给控制器进行打印

    通用存储库接口 函数域类 职能单位
    虽然它是基于意见的,但仅工作单元模式的名称就表明对象的时间跨度有限。所以在控制器中使用它应该是

    public ActionResult Index()
    {
       using(var UOF = new Function_UnitOfWork()) {
    
         var a1 = UOF.GetAllFunctions();
    
         foreach(var item in a1)
         {
           var b1 = item.Title;
         }
       }
    
        return View();
    }
    
    我们使用的另一种方法是(简而言之)

    公共类数据对象{}
    公共类Repo:IRepo其中T:DataObject
    公共类RepoController:Controller,其中T:DataObject{
    受保护的IRepo回购;
    }
    
    因此,控制器将是通用的,并且将具有特定回购的字段


    您将使用一些依赖项注入工具(如ninject或mef)将控制器与后台的repo绑定。

    这是一个意见问题,不太适合StackOverflow。您可以查看其他与编程相关的StackExchange网站,看看它是否更适合他们的问题指南。它更像是问题。在我看来,这个问题属于@Lankymart。我同意这是一个非常有用的问题,但最佳实践指南只是表示基于意见的另一种方式,因此更适合提到的另一个StackExchange站点。关于StackOverflow的最佳实践指南在给出具体答案时非常有用。若你们注意到了,我也给出了一个完整的示例存储库和unitofwork,但我的问题是理解使用多个unitofwork、封装存储库代码以及为控制器提供公共功能来实现的基础
    public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        protected DbSet<TEntity> _DbSet;
        private readonly DbContext _dbContext;
    
        public GenericRepository()
        {
    
        }
    
        public GenericRepository(DbContext dbContext)
        {
            this._dbContext = dbContext;
            _DbSet = _dbContext.Set<TEntity>();
        }
    
    
    
        public IQueryable<TEntity> GetAll()
        {
            return _DbSet;
        }
    
    
        public void Dispose()
        {
    
        }
    }
    
     public class BaseContext<TContext> : DbContext where TContext : DbContext
    {
        static BaseContext()
        {
            Database.SetInitializer<TContext>(null);
        }
    
        protected BaseContext()
            : base("name = ApplicationDbConnection")
        { }
    }
    
     public class FunctionsContext : BaseContext<FunctionsContext>
    {
        public DbSet<App_Functions> Functions { get; set; }
    }
    
    [Table("Functions")]
    public class App_Functions
    {
         public App_Functions()
        {
        }
    
        [Key]
        public int Function_ID { get; set; }
    
        [StringLength(50)]
        [Required]
        public string Title { get; set; }
    
        public int Hierarchy_level { get; set; }
    }
    
     public class Functions
    {
        public Functions()
        {
    
        }
    
        public int Function_ID { get; set; }
        public string Title { get; set; }
        public int Hierarchy_level { get; set; }
    }
    
    public class Function_UnitOfWork
    {
       private GenericRepository<App_Functions> _function_Repository = new GenericRepository<App_Functions>(new FunctionsContext());
    
       public Function_UnitOfWork()
       {
    
       }
    
       private List<Functions> getAllFunctionsFromRepository()
       {
           List<Functions> query = new List<Functions>();
    
           query = _function_Repository.GetAll().Select(x => new Functions
           {
               Function_ID = x.Function_ID,
               Title = x.Title,
               Hierarchy_level = x.Hierarchy_level
           }).ToList();
    
           return query; 
       }
    
       public List<Functions>GetAllFunctions()
       {
           return getAllFunctionsFromRepository();
       }
    
    
    
    }
    
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
             Function_UnitOfWork UOF = new Function_UnitOfWork();
    
           var a1 = UOF.GetAllFunctions();
    
            foreach(var item in a1)
            {
                var b1 = item.Title;
            }
    
    
            return View();
        }
    }
    
    public ActionResult Index()
    {
       using(var UOF = new Function_UnitOfWork()) {
    
         var a1 = UOF.GetAllFunctions();
    
         foreach(var item in a1)
         {
           var b1 = item.Title;
         }
       }
    
        return View();
    }
    
    public class DataObject { }
    
    public class Repo: IRepo<T> where T: DataObject
    
    public class RepoController<T> : Controller where T: DataObject {
       protected IRepo<T> Repo;
    }