我使用这种架构创建了一个应用程序:
public class Car { public int Id { get; set; } public string Name { get; set; } }
public class UnitOfWork { // ... public Repository<Car> Cars { get; set; } // ... } public class Repository<T> { // ... // Add / Update / Delete ... // ... }
现在我想找到一种使用方法与数据交互的方法。例如在MyProject.Model.Car
中我想添加一个方法来获取具有非导航属性的数据,一个名为`GetSimilarCars()'的方法。问题是存储库无法与其他存储库交互,因此无法对数据库执行操作。
我真的不知道如何以一种简单的方式做到这一点,而且我的架构中最好的地方就是这个。
另一个示例可能是UserGroup.Deactivate()
,此方法会停用每个用户并通过电子邮件向他们发送通知。当然,我可以将此方法放在Web应用程序控制器中,但我认为这不是放置可在应用程序的许多地方调用的代码的地方。
注意:我正在使用实体框架。
有关如何实施此类行动的任何建议吗?
答案 0 :(得分:2)
我认为您的业务层(BL)将与您的数据访问层(DAL)进行通信。从你的BL那里你可以到达DAL的不同存储库。这将解决您的存储库无法共享数据的问题(该数据将通过BL共享)。
答案 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);
}