我现在只想知道如何使用EF
在MVC3中以正确的方式分隔代码根据我的项目结构。
演示文稿 - >查看&控制器
域名 - >模型(商业实体)
数据 - > RepositoryBase,IRepository,ApplicationDbContext
服务 - >第三方服务(PayPal,SMS)或应用服务
ApplicationDbContext需要Model作为参考。
public sealed class ApplicationDbContext : DbContext
{
public DbSet<CountryModel> Country { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
1。那么将DbContext放在数据中是否合适?或者我必须将其移动到域中?
现在在控制器中我必须编写代码
using (ApplicationDbContext db = new ApplicationDbContext())
{
var countryRepository = new Repository<Country>(db);
if (ModelState.IsValid)
{
countryRepository.insert(country);
db.SaveChanges();
}
}
有没有办法将此代码块分隔为任何业务层/服务层?
所以我们只需从控制器&amp;只需通过特定业务实体即可执行其余操作。
我想做PL - &gt; BLL - &gt; DLL方法使用MVC 3&amp; EF?
请建议我正确的方法。
答案 0 :(得分:2)
你可以在每个业务实体调用存储库表单的BLL创建类中为彼此创建单独的项目,并创建一些你需要的基本功能,如插入删除查找带参数的选择等
var country =new Country();//it's class of BLL
if (ModelState.IsValid)
{
country.insert(country);
}
类似的东西
答案 1 :(得分:2)
将DbContext放入数据是否合适?
是的,它就属于它。
现在在控制器中我必须编写代码
不,您绝对不应该在控制器中编写这样的代码,因为您现在正在使您的控制器与您正在使用的特定数据访问技术(在您的情况下为EF)强烈耦合。更糟糕的是,您将无法单独对控制器进行单元测试。
我建议你在界面中的实体上抽象操作(你已经在你的问题中提到了它 - IRepository
)。现在你的控制器可以将存储库作为依赖:
public class CountriesController: Controller
{
private readonly IRepository repository;
public CountriesController(IRepository repository)
{
this.repository = repository;
}
public ActionResult Index(int id)
{
Country country = this.repository.Get<Country>(id);
return View(country);
}
[HttpPost]
public ActionResult Index(Country country)
{
if (ModelState.IsValid)
{
this.repository.Insert(country);
return RedirectToAction("Success");
}
return View(country);
}
}
现在,您所要做的就是配置您喜欢的依赖注入框架,以将此IRepository的特定实现注入控制器构造函数。在您的情况下,此特定实现可能是一些实现IRepository接口的类,并且正在使用ApplicationDbContext
内部。
通过这种方式,您可以从控制器中抽象出数据访问逻辑。