Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

一.前言

由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC;但是主项目可以注入,插件注入失败,

没有为该对象定义无参数的构造函数。下面就一步一步注入插件项目。

二.新建带有插件的项目

参考:ASP.NET MVC5 插件化机制简单实现

项目结构如下图:

三.建立DomainServices类库

   新建一个ITestService接口,代码如下:

namespace DomainServices
{
public interface ITestService
{
string GetData();
string GetMainData();
}
}

新建一个TestService类实现ITestService,代码如下:

namespace DomainServices
{
public class TestService:ITestService
{
public string GetData()
{
return "这是插件获取的Services数据";
} public string GetMainData()
{
return "这是主项目获取的Services数据";
}
}
}

四.autofac实现主项目注入和插件注入

1.主项目引用autofac、autofac.Integration.Mvc

工具->库程序包管理器->管理解决方案的NuGet程序包:

2.主项目新建一个AutoFacBootStrapper.cs类,实现autofac注入

代码如下:

using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc; namespace Web
{
public class AutoFacBootStrapper
{
public static void AutoFacInit()
{
var builder = new ContainerBuilder(); //注册DomainServices
var services = Assembly.Load("DomainServices");
builder.RegisterAssemblyTypes(services, services)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().PropertiesAutowired(); //实现插件Controllers注入
var assemblies = new DirectoryInfo(
HttpContext.Current.Server.MapPath("~/App_Data/Plugins/"))
.GetFiles("*.dll")
.Select(r => Assembly.LoadFrom(r.FullName)).ToArray();
foreach (var assembly in assemblies)
{
builder.RegisterControllers(assembly).PropertiesAutowired();
} //注册主项目的Controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}

3.启用autofac注入,在Global程序Start的地方添加AutoFacBootStrapper.AutoFacInit();

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace Web
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//启用autofac注入
AutoFacBootStrapper.AutoFacInit();
}
}
}

五.测试autofac注入是否成功

1.主web的HomeController给出构造函数注入demo

using System.Web.Mvc;
using DomainServices; namespace Web.Controllers
{
public class HomeController : Controller
{
//public ITestService Service { get; set; }
ITestService _service;
public HomeController(ITestService service)
{
_service = service;
} public ActionResult Index()
{
ViewBag.Show = _service.GetMainData();
return View();
}
}
}

主项目的View代码:

@{
ViewBag.Title = "Home Page";
} <div class="jumbotron">
<h1>ASP.NET</h1>
<p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
<p><a href="http://asp.net" class="btn btn-primary btn-large">Learn more &raquo;</a></p>
</div> <div class="row">
<p>这里是autofac注入的主项目:@ViewBag.Show </p>
@Html.ActionLink("Demo插件内容访问点击这里", "Index", "Home", new { area = "Demo" }, null)
</div>

2.插件的HomeControllers给出一个属性注入demo

注意:autofac官网不建议使用属性注入,为了便于演示,我在AutoFacBootStrapper也加上了属性注入了。具体项目的时间建议使用构造函数注入的方式。

using System.Web.Mvc;
using DomainServices; namespace Plugin.Demo.Controllers
{
public class HomeController : Controller
{
public ITestService Service { get; set; } public ActionResult Index()
{
ViewBag.Show=Service.GetData();
return View();
}
}
}

插件的View代码:

<div>
<p>ASP.NET MVC 插件化:Plugin.Demo 内容</p>
<p>autofac注入插件:@ViewBag.Show</p>
</div>

3.重新生成插件,运行主项目,效果如下:

主项目页面autofac注入成功后调用DomainServices的数据如下:

插件:

 
分类: ASP.NET MVC

ASP.NET MVC5 插件机制中插件的简单实现的更多相关文章

  1. Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

    一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目 ...

  2. asp.net mvc5轻松实现插件式开发

    在研究Nopcommece项目代码的时候,发现Nop.Admin是作为独立项目开发的,但是部署的时候却是合在一起的,感觉挺好 这里把他这个部分单独抽离出来, 主要关键点: 确保你的项目是MVC5 而不 ...

  3. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造

    第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  5. [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  6. Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5

    1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...

  7. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统

    开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4. ...

  8. Asp.net MVC]Asp.net MVC5系列——在模型中添加

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理   http://ww ...

随机推荐

  1. C++程序代写实现HashSet class

    C++程序代写实现HashSet class 专业程序代写(QQ:928900200) Implement a HashSet class for elements of type string.It ...

  2. iOS 删除黑色边框线导航栏&amp;删除搜索框的阴影边界线和中黑色文本输入框 - 解

    删除黑色边框线导航栏 in viewDidload: [self.navigationController.navigationBar setBackgroundImage:[[UIImage all ...

  3. 【Android 应用程序开发】 Fragment 详细说明

    笔者 : 汉书亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragmen ...

  4. HTML介绍JS

    首先,该脚本的链接插入HTML代码: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2h1aVRpYW5OYWlMdW8=/font/5a6L5L2T/f ...

  5. 管理Android通信录

    Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据 ...

  6. oracle 12c 三学习 pdb 可插拔测试

    DECLARE l_result BOOLEAN; BEGIN l_result := DBMS_PDB.check_plug_compatibility( pdb_descr_file => ...

  7. unity3d脚本

    一 创建和使用脚本 1 概述 GameObject的行为都是被附加到其上面的组件控制,脚本本质上也是一个组件. 在unity中创建一个脚本.默认内容例如以下: using UnityEngine; u ...

  8. 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

    内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...

  9. RunJS推荐用于个人使用(使用方便JS、css实时预览、编辑、管理等功能)

    RunJS,在线编写.展示html.js.css代码,拥有实时预览.分享.Fork.代码高亮.自己主动完毕等多项特性,提供文件上传.多种登录方式. 地址:http://runjs.cn/ waterm ...

  10. Connect2015 简要整理

    2015 简要整理 去年 Connect(); 2014 Visual Studio Contact(); 直播笔记 对于我个人来说,今年 Connect(); 的三个重要发布: ASP.NET 5 ...