代码之家  ›  专栏  ›  技术社区  ›  Mickel

在使用ASP.NET MVC和实体框架时,哪种设计模式更可取?

  •  1
  • Mickel  · 技术社区  · 15 年前

    我不太确定在使用ASP.NET MVC和实体框架时,使用哪种设计模式最有效,因此非常感谢任何指导!

    您是将上下文存储在控制器类中,还是最好创建一个存储库?

    如果您建议使用repo设计,是否需要像这样初始化每个方法中的上下文?或者这是更好的方法吗?:

    public SomeEntity GetEntity(Guid id) {
       using(Context ctx = new Context()) {
          // code here...
       }
    }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   Craig Stuntz    15 年前

    我使用存储库模式。上下文在存储库中,并且和存储库一样长。存储库在Controller.Initialize中初始化,并在Controller.Dispose中释放。这意味着在请求完成之前,一个请求会得到一个存储库/上下文,这很好地工作——请求很短,因此上下文被快速处理。但是,当一个操作调用多个存储库方法时,它们都使用相同的上下文,这使得许多事情变得更容易。

        2
  •  0
  •   Robert Koritnik    15 年前

    存储库模式是前进的道路

    取决于您的项目大小,但如果它不是一个小问题,我建议使用存储库模式,因为它也更容易维护。

    尽可能晚地打开上下文并尽快关闭
    与连接类似,您还应该尽可能快地释放上下文,所以在通过ef实际读取/提交到db之前,请执行任何其他处理。所以。尽可能短地使用模块。

        3
  •  0
  •   LukLed    15 年前

    我用接口创建了自己的通用存储库类:

    public interface IRepository<T>
    {
        //Retrieves list of items in table
        IQueryable<T> List();
        IQueryable<T> List(params string[] includes);
        //Creates from detached item
        T Create(T item);
        //Updates from detached item
        //Attached item can be change directly and using SaveChanges
        T Edit(T item);
        void Delete(int id);
        void DeleteObject(object item);
        T Get(int id);
        T Get(int id, params string[] includes);
        void SaveChanges();
    }
    

    它负责基本的CRUD操作,它也有上下文。在存储库中,我有保存业务登录的服务类。例子:

    public interface IProjectService
    {
        IQueryable<Project> ListProjects();
        Project GetProjectByName(string name);
        Project GetProjectByID(int id);
        bool EditBasicProjectData(Project project);
        bool CreateProject(Project project);
        bool DeleteProject(int id);
        void SetCurrentProjectByID(int id);
    }
    

    每个服务都有必要的存储库。控制器有Ninject注入的服务。控制器方法很短,它们只将数据从服务传递到视图(以两种方式)。这使得整个项目易于测试。您可以模拟存储库来测试服务。您可以模拟服务来测试控制器。