如何使用数据库逻辑添加自定义方法

时间:2013-11-04 22:12:33

标签: c# asp.net-mvc entity-framework repository-pattern

我使用这种架构创建了一个应用程序:

  • MyProject。型号:包含POCO。例如:
public class Car
{
     public int Id { get; set; }
     public string Name { get; set; }
}
  • MyProject。存储库:包含存储库和UnitOfWork
public class UnitOfWork
{
    // ...
    public Repository<Car> Cars { get; set; }
    // ...
}

public class Repository<T>
{
    // ...
    // Add / Update / Delete ...
    // ...
}
  • MyProject。 Web :ASP.Net MVC应用程序

现在我想找到一种使用方法与数据交互的方法。例如在MyProject.Model.Car中我想添加一个方法来获取具有非导航属性的数据,一个名为`GetSimilarCars()'的方法。问题是存储库无法与其他存储库交互,因此无法对数据库执行操作。

我真的不知道如何以一种简单的方式做到这一点,而且我的架构中最好的地方就是这个。

另一个示例可能是UserGroup.Deactivate(),此方法会停用每个用户并通过电子邮件向他们发送通知。当然,我可以将此方法放在Web应用程序控制器中,但我认为这不是放置可在应用程序的许多地方调用的代码的地方。

注意:我正在使用实体框架。

有关如何实施此类行动的任何建议吗?

3 个答案:

答案 0 :(得分:2)

我认为您的业务层(BL)将与您的数据访问层(DAL)进行通信。从你的BL那里你可以到达DAL的不同存储库。这将解决您的存储库无法共享数据的问题(该数据将通过BL共享)。

见这里:N-tier architecture w/ EF and MVC

答案 1 :(得分:2)

这种类型的东西进入你的DAL(在这个有限的场景中,基本上是你的工作单元和存储库)。然而,当我第一次开始使用MVC时,这是一种让我感到困惑的模式。实体框架已经实现了这些模式;您的DbContext是您的工作单位,而您的DbSet是您的存储库。在此之上创建另一层的所有方法都增加了复杂性。我个人最终选择了服务模式,它只是位于EF之上,允许我做一些像someService.GetAllFoo()这样的事情。这样,实体框架的使用就被抽象掉了(我可以随时切换DAL。我甚至可以完全删除数据库,而不是在我的应用程序的其余部分更改任何代码。)但我也不只是重新发明轮子。

在服务模式中,您只是专门为您需要的东西提供端点,因此它是GetSimilarCars之类的完美候选者,因为您只需向服务添加另一个方法来封装逻辑这一点。

答案 2 :(得分:0)

我不太明白你的问题,但这是你分配价值的方式。并将其添加到集合

public class Repository<T>
    {       

    List<car> _lstCar=new List<car>();
    //Add
    car cobj=new car();
    cobj.Id="1234";
    cobj.Name="Mercedes";

    _lstCar.Add(cobj);

    }