發了前面兩篇文章后,有的同學說:“分層應該依項目而定,沒有什么最好的分層,只有最合適的。” 也有同學說 “分層太復雜,才多大的項目”
在這里我想發表下我的看法,個人之言,權當討論的話題:首先說分層應該依項目而定,這話總體來說沒有錯誤,但是到底什么樣的項目該用什么樣的分層
這個沒有定數,至少我還不知道這個確切的分界線~況且,我們現在可能做個小項目,到以后也許慢慢發展起來怎么辦?
對於這個分層是否過於復雜,個人並不是這么看的,至少這么分層,每個分層都有其中不可少的因素在里面。前期搭建好以后,也許項目真的發展起來后,
會有助於項目真正的開發。當然,如果是小項目,個人也覺得沒有必要分太多層。
好了,現在說說,我們這個EF的底層框架怎么搭建。
首先 我們現在數據庫建一個表 Product 表結構如下:
在CinDou.EFramework層中建立 CinDouDbContext.cs 文件,代碼如下
using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.ModelConfiguration.Conventions; using CinDou.Tools; using CinDou.Model; namespace CinDou.EFramework { string connection="xxxxx"; //數據庫鏈接 public class CinDouDbContext : DbContext { public AppedDbContext() : base(connection) { } public DbSet<Product> Products{get; set;} protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除復數表名的契約 modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要訪問 EdmMetadata這個表 } } }
在 CinDou.Model 項目中建立 Product.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.DataAnnotations; namespace CinDou.Model { public class Product { public int ID { get; set; } [Column("Name")] public string ProductName { get; set; } [Column("Price")] public decimal ProductPrice { get; set; } public DateTime CreateDate { get; set; } } }
在BFactoy和DFactory層中分別建立BLLFactory。cs 和 DALFactory.cs
using System; using System.Collections.Generic; using System.Reflection; using System.Linq; using System.Text; using CinDou.Tools; using CinDou.IBLL; using CinDou.BLL; namespace CinDou.BFactory { public sealed class BLLFactory { static string bllLayer = WebSite.BLLAssembly; public static CinDou.IBLL.IProduct CreateProduct() { return (CinDou.IBLL.IProduct)Assembly.Load(bllLayer).CreateInstance(bllLayer + ".Product"); } } }
using System.Reflection; using CinDou.Tools; using CinDou.IDAL; using CinDou.DAL; namespace CinDou.DFactory { public sealed class DALFactory { static string dalLayer = WebSite.DALAssembly; public static CinDou.IDAL.IProduct CreateProduct() { return (CinDou.IDAL.IProduct)Assembly.Load(dalLayer).CreateInstance(dalLayer + ".Product"); } } }
這里,我們使用了反射和工廠模式。這樣便於解耦和層的封閉
在CinDou.IBLL和CinDou.IDAL中分別建立IProduct.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using CinDou.Model; namespace CinDou.IBLL { public interface IProduct { bool Add(CinDou.Model.Product product); IEnumerable<CinDou.Model.Product> List(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using CinDou.Model; namespace CinDou.IDAL { public interface IProduct { bool Add(Product product); IEnumerable<Product> List(); } }
然后再在CinDou.BLL和CinDou.DAL中建立Product.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using CinDou.IBLL; using CinDou.DFactory; using CinDou.IDAL; using CinDou.DAL; using CinDou.Model; namespace CinDou.BLL { public class Product : CinDou.IBLL.IProduct { public bool Add(CinDou.Model.Product product) { return CinDou.DFactory.DALFactory.CreateProduct().Add(product); } public IEnumerable<CinDou.Model.Product> List() { return CinDou.DFactory.DALFactory.CreateProduct().List(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using CinDou.IDAL; using CinDou.EFramework; using CinDou.Model; using CinDou.Tools; namespace CinDou.DAL { public class Product : CinDou.IDAL.IProduct { private CinDouDbContext CinDouDB = new CinDouDbContext; public bool Add(CinDou.Model.Product product) { bool flag = false; try { CinDouDB.Products.Add(product); CinDouDB.SaveChanges(); flag = true; } catch{ } return flag; } public IEnumerable<CinDou.Model.Product> List() { return CinDouDBProducts.ToList(); } } }
我們再在CinDou.Route項目中建立 Controllers文件夾,然后建立ProductController.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Mvc; using CinDou.IBLL; using CinDou.BFactory; namespace CinDou.Route.Controllers { public class ProductController : Controller { public ViewResult Index() { return View(CinDou.BFactory.BLLFactory.CreateProduct().List()); } public ActionResult Create() { return View(new CinDou.Model.Product()); } // // POST: /Department/Create [HttpPost] public ActionResult Create(CinDou.Model.Product product) { bool flag = CinDou.BFactory.BLLFactory.CreateProduct().Add(product); return RedirectToAction("Index"); } } }
在CinDou.Web項目中的Views文件夾下建立Product文件夾,在里面建立Index.cshtml文件
在建立的時候,借助vs的智能感應,能非常方便的建立index.cshtml文件中的內容。
@model IEnumerable<CinDou.Model.Product> <p> @Html.ActionLink("Create New", "Create") </p> <table> <tr> <th> ProductName </th> <th> ProductPrice </th> <th> CreateDate </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.ProductName) </td> <td> @Html.DisplayFor(modelItem => item.ProductPrice) </td> <td> @Html.DisplayFor(modelItem => item.CreateDate) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> } </table>
項目至此,已經差不多建立完整了。最后再附上我的源碼。便於理解吧~