一.前言

由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用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 »</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的数据如下:

插件:

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

  1. ASP.NET MVC5 插件机制中插件的简单实现

    Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入 ...

  2. 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法

    之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...

  3. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  4. 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...

  5. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

  6. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  7. asp.net mvc4 简单使用Autofac依赖注入小结

    1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...

  8. Autofac 依赖注入小知识

    Autofac 依赖注入小知识 控制反转/依赖注入 IOC/DI 依赖接口而不依赖于实现,是面向对象的六大设计原则(SOLID)之一.即依赖倒置原则(Dependence Inversion Prin ...

  9. Autofac依赖注入框架使用

    简介: Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高 控制反转和依赖注入: 控制反转 IOC(Inver ...

随机推荐

  1. Web Server 和 HTTP 协议

    https://toutiao.io/posts/xm2fr/preview 一直在找实习,有点什么东西直接就在evernote里面记了,也没时间来更新到这里.找实习真是个蛋疼的事,一直找的是困难模式 ...

  2. Ubuntu 取消sudo密码

    需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...

  3. *[hackerrank]Sam and sub-strings

    https://www.hackerrank.com/contests/w3/challenges/sam-and-substrings DP.注意到以N[i]结尾的每个字符串的子数字和有规律: 53 ...

  4. 打败Google的灵童今在何方?

    微软和雅虎宣布在搜索和广告上10年合作,这事儿不知是不是前不久虚惊一场的微软收购雅虎案的好戏重演之序幕. 从表面上看,这次的合作改变不了搜索和广告目前的世界格局,也构不成对Google的致命威胁,反倒 ...

  5. Android:PopupWindow简单弹窗

    两布局,一个当前布局页面和一个点击展示布局页面,主程序代码: public class MainActivity extends Activity { private PopupWindow pop; ...

  6. 【Android多屏适配】动态改变Listview item高度

    在ListView的Adapter中去直接获取传入View的LayoutParams是会报空指针异常的,唯一的方法是在xml中嵌套布局一层LinearLayout <?xml version=& ...

  7. PCL—低层次视觉—点云分割(最小割算法)

    1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出 ...

  8. OpenCV在Android平台上的应用

    今年8月份, OpenCV 2.3.1发布了. 虽然从2.2开始, OpenCV就号称支持Android平台, 但真正能让OpenCV在Android上运行起来还是在2.3.1版本上. 在这个版本上, ...

  9. python中的MySQL数据库操作 连接 插入 查询 更新 操作

    MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...

  10. bzoj3252

    简单题,每次取出最长链,然后对于练上每个点x,终点在其子树内的链都要减去a[x] 这显然可以用dfs序+线段树维护 显然每个点只要删一次即可,复杂度是O(nlogn) type node=record ...