zoukankan      html  css  js  c++  java
  • 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的数据如下:

    插件:

  • 相关阅读:
    数据库连接
    《程序员修炼之道--从小工到专家》读后感(二)
    《程序员修炼之道--从小工到专家》读后感(一)
    《继承与多态》动手动脑
    MyFirstJavaWeb
    静态初始化块的执行顺序
    使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
    FJUT 毒瘤3(二分 + 最大匹配)题解
    HDU 4638 Group(莫队)题解
    HDU 4391 Paint The Wall(分块的区间维护)
  • 原文地址:https://www.cnblogs.com/Alex80/p/5595509.html
Copyright © 2011-2022 走看看