MVC3+EF+Autofac网上这种文章确实没有,呵呵,今天就写一个,代大家分享!

这个系列的文章将带我们进入一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合,这是可以的。而注入点的位置及方式也是多种多样的,我们今天主要说一个通过HTTP请求进行注入的方式,IOC工具使用高效的

Autofac,对它的认识你可以看这篇文章

首先看一下我们这个项目的知识点:

MVC3~一个对UI层进行分层的架构模式,在微软的MVC3中加入了开源的Razor引擎

EF~这无疑是微软自己比较成功的ORM工具,它执行效率上要高于linq to sql,甚至你自己编写的ado.net脚本。

Autofac~这是在orchard项目中被广泛的IoC工具,它支持类型,反泛,HTTP等注入

对于这个系统的autofac部分,我们将它的注入点放在controller的构造函数中,将生产的对象配置在global中,当然,你也可以设置在config文件,或者你自己的XML文件。

我认为它的工作方式应该是:

网站启动=>从global中得到ioc配置信息=>http request请求页面=>通过controller中的参数进行实现的创建=>action中使用创建好的对象

OK,有了这样一个理论基础,我们来看一下代码吧:

EF部分的DATA层

  1   /// <summary>
2 /// EF数据结构实现
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class Repository<T> : IRepository<T> where T : class
6 {
7 private readonly DbContext _db;
8
9 public Repository()
10 {
11 Logger = NullLogger.Instance;
12 _db = new EEE114Entities();
13 }
14
15 public ILogger Logger { get; set; }
16 #region IRepository<T> 成员
17 List<string> _columns;
18 public Repository<T> AddColumn(Func<string> func)
19 {
20 _columns.Add(func());
21 return this;
22 }
23 #region Create,Update,Delete
24 public virtual void Create(T entity)
25 {
26 Logger.Debug("Create {0}", entity);
27 _db.Entry<T>(entity);
28 _db.Set<T>().Add(entity);
29 }
30
31 public virtual void Update(T entity)
32 {
33 Logger.Debug("Update {0}", entity);
34 _db.Set<T>().Attach(entity);
35 var ObjectStateEntry = ((IObjectContextAdapter)_db).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity);
36 string[] p = { };
37 Array.ForEach(p, x =>
38 {
39 ObjectStateEntry.SetModifiedProperty(x.Trim());
40 });
41 }
42
43 public virtual void Delete(T entity)
44 {
45 Logger.Debug("Delete {0}", entity);
46 _db.Set<T>().Attach(entity);
47 _db.Set<T>().Remove(entity);
48 }
49
50 public virtual void SaveChanges()
51 {
52 try
53 {
54 _db.SaveChanges();
55 }
56 catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
57 {
58 string Message = "error:";
59 if (ex.InnerException == null)
60 Message += ex.Message + ",";
61 else if (ex.InnerException.InnerException == null)
62 Message += ex.InnerException.Message + ",";
63 else if (ex.InnerException.InnerException.InnerException == null)
64 Message += ex.InnerException.InnerException.Message + ",";
65 throw new Exception(Message);
66 }
67 }
68 #endregion
69
70 #region Get
71 public virtual int Count(Expression<Func<T, bool>> predicate)
72 {
73 return Fetch(predicate).Count();
74 }
75 public T Get(params object[] id)
76 {
77 throw new NotImplementedException();
78 }
79 public virtual T Get(Expression<Func<T, bool>> predicate)
80 {
81 return Fetch(predicate).SingleOrDefault();
82 }
83 public IQueryable<T> Table
84 {
85 get { return _db.Set<T>(); }
86 }
87
88 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate)
89 {
90 return Table.Where(predicate);
91 }
92
93 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order)
94 {
95 var orderable = new Orderable<T>(Fetch(predicate).AsQueryable());
96 order(orderable);
97 return orderable.Queryable;
98 }
99
100 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order, int skip, int count)
101 {
102 return Fetch(predicate, order).Skip(skip).Take(count);
103 }
104 #endregion
105
106 #endregion
107 }

Services层(BLL层)核心代码:

 1  /// <summary>
2 /// 网站异常业务
3 /// </summary>
4 public class Web_ExceptionLogManager : IWeb_ExceptionLogManager
5 {
6 IRepository<Web_ExceptionLog> _web_ExceptionLogRepository;
7 public Web_ExceptionLogManager(IRepository<Web_ExceptionLog> web_ExceptionLogRepository)
8 {
9 _web_ExceptionLogRepository = web_ExceptionLogRepository;
10 }
11 #region IWeb_ExceptionLogManager 成员
12
13 public List<Web_ExceptionLog> GetWeb_ExceptionLog()
14 {
15 return _web_ExceptionLogRepository.Fetch(i => i.FullInfo != null, i => i.Asc(j => j.OccurTime)).ToList();
16
17 }
18
19 #endregion
20 }

WEB层MVC部分代码:

 1  public class HomeController : Controller
2 {
3 IRepository<Web_Logs> _iRepository;
4 IWeb_ExceptionLogManager _web_ExceptionLogManager;
5
6 public HomeController(IRepository<Web_Logs> iRepository, IWeb_ExceptionLogManager web_ExceptionLogManager)
7 {
8 _iRepository = iRepository;
9 _web_ExceptionLogManager = web_ExceptionLogManager;
10 }
11
12 public ActionResult Index(int sort = 1)
13 {
14 ViewBag.Message = "欢迎使用 ASP.NET MVC!";
15
16 var model = _iRepository.Fetch(i => i.Info != null, i => i.Asc(j => j.OccurTime));
17 if (sort != 1)
18 model = _iRepository.Fetch(i => i.Info != null, i => i.Desc(j => j.OccurTime));
19
20 ViewBag.Log = _web_ExceptionLogManager.GetWeb_ExceptionLog();
21 return View(model);
22 }

而注入参数我们放在global中,看一下核心代码:

 1  protected void Application_Start()
2 {
3 #region Autofac注入
4 var builder = new ContainerBuilder();
5 builder.RegisterControllers(Assembly.GetExecutingAssembly());
6 builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
7
8 builder.RegisterType<Web_ExceptionLogManager>().As<IWeb_ExceptionLogManager>().InstancePerHttpRequest(); //从HTTP请求中重到注入点
9
10 IContainer container = builder.Build();
11 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
12 #endregion
13
14 AreaRegistration.RegisterAllAreas();
15 RegisterGlobalFilters(GlobalFilters.Filters);
16 RegisterRoutes(RouteTable.Routes);
17 }

OK,我们运行后,在/Home/Index中自己运行HTTP请求把global中的对象进行创建,当然,它在创建对象时,你可以是DATA层,或者是SERVICE层的,这里

没有考虑WEB不能与DATA通讯问题,实际项目中,我们的WEB层不应该有对DATA层的引用,所以,WEB层一般只注入SERVICE的对象,这一点是需要注意的。

最新文章

  1. 8 HTML&amp;JS等前端知识系列之Ajax的例子
  2. P2P的原理和常见的实现方式(为libjingle开路)
  3. AutoMapper配置方法
  4. UML类图常见的几种关系
  5. C++类静态成员的初始化和用法探讨
  6. (原)Vs中debug和release结果不一致
  7. 【转】CentOS 使用yum命令安装出现错误提示&rdquo;could not retrieve mirrorlist http://mirrorlist.centos.org ***&rdquo;
  8. ubuntu 把终端信息输出到文本文件中的方法
  9. SIMATIC_STEP_V5.6使用报错
  10. 小程序 第一个学习示例(TodoList)
  11. SringMVC概述
  12. 集合总结五(Hashtable的实现原理)
  13. hihoCoder #1106 : Koch Snowflake 微软苏州校招笔试(1月17日)
  14. leecode 937 Reorder Log Files (模拟)
  15. BZOJ2330 SCOI2011糖果
  16. ios 在UIView上画图,线条
  17. hdu 3262 09 宁波 现场 C - Seat taking up is tough 暴力 难度:0
  18. Codeforces766A Mahmoud and Longest Uncommon Subsequence 2017-02-21 13:42 46人阅读 评论(0) 收藏
  19. UOJ#55. 【WC2014】紫荆花之恋
  20. jni 找不到本地方法的实现

热门文章

  1. Android Canvas之Path操作
  2. vs:如何添加.dll文件
  3. 数据存储之Archiver、Unarchiver、偏好设置
  4. js学习总结--DOM2兼容处理重复问题
  5. 如何使用CocoaPods安装使用及配置私有库以及管理依赖库 【原创】
  6. iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)
  7. struct对齐
  8. Chrome性能分析工具Coverage使用方法
  9. Chrome性能分析工具lightHouse用法指南
  10. 【模板】区间第k小