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 »</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的数据如下:

插件:

时间: 2024-10-14 05:01:44

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

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

Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目. 二.新建带有插件的项目 参考:ASP.NET MVC5 插件化机制简单实现 项目结构如下图: 三.建立DomainServices类库    新建一个ITestService接口,代码如下: namespace Dom

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

一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 1 namespace Wchl.WMBlog.IRepository 2 { 3 public partial interface IsysUserInfoRepository : IBaseRepository<sysUserInfo> 4 { 5 6 } 7 } 2.创建sysUserInfoRepository类继承BaseReposit

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

1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IRepository { void GetListCount(); } 2,实现类 public class Repository:IRepository { public void GetListCount() { //return 1; } } 3,控制器 public class HomeController

Autofac依赖注入框架使用

简介: Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高 控制反转和依赖注入: 控制反转 IOC(Inverse Of  Control) :  简单通俗的说,就是本来创建对象的实例,由我们程序员自己创建,现在交给IOC容器来创建,所以称为控制反转. 依赖注入DI(Dependence injection) :  容器创建好实例后再注入,称为依赖注入. 主要应用: 实现各个层之间的解耦.每个层调用的都是接

autofac依赖注入MVC5和webapi2

终于把丢了好久的MVC捡起来,虽然有些许印象,但是还需要重新学习. 很多书本中都提到依赖注入,控制反转等概念,这些都是为了实现松耦合层.组件和类目的. 常见的是使用Repository类分离Controller和Model的直接联系.而为了解除Repository类和Controller的紧密联系,通常不是直接定义Repository类并实例化,而是通过Controller的构造方法注入指定的Repository. 1 public class ValuesController : ApiCon

Autofac 依赖注入框架

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高. 官方网站http://autofac.org/ 优点:依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled).可维护.可测试的代码和程序.这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程. 方法一:注册组件,Register Components var builder = new Contain

WebAPI2使用AutoFac依赖注入完整解决方案。

WebApi2上进行依赖注入,在百度里能搜到的的完整解决方案的文章少之又少,缺胳膊断腿. 和MVC5依赖注入的不同之处,并且需要注意的地方,标记在注释当中.上Global代码: namespace S2S.WebApi { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { //----AutoFac DI------ var builder = ne

Autofac 依赖注入框架 使用

简介 Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高. 官方网站http://autofac.org/ 源码下载地址https://github.com/autofac/Autofac 最新版本下载可以看到,包括源码,示例文档,与之相关的测试项目,生成的DLL文件,其他文档 控制反转和依赖注入 关于控制反转和依赖注入的文章和书籍很多,对其定义也解释的也仁者见仁,这里就不赘述了,这是本人(只代表个人观点)

依赖注入 &ndash; ASP.NET MVC 4 系列

       从 ASP.NET MVC 3.0 开始就引入了一个新概念:依赖解析器(dependence resolver).极大的增强了应用程序参与依赖注入的能力,更好的在 MVC 使用的服务和创建的一些类(控制器和视图页面)之间建立依赖关系.为更好的理解依赖解析器的工作原理,下面首先定义一些它所用到的通用软件模式. 软件设计模式        软件设计模式主要用来规范问题及其解决方案的描述,简化开发人员对常见问题及其对应解决方案的标识与交流.设计模式并不是新奇的发明,而是为行业中常见的实践