如何在ASP.NET MVC 3中分离代码(清除代码分离)?

时间:2013-01-08 07:15:04

标签: asp.net-mvc-3 entity-framework

我现在只想知道如何使用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?

请建议我正确的方法。

2 个答案:

答案 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内部。

通过这种方式,您可以从控制器中抽象出数据访问逻辑。