• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一.前言

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

一.前言

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

插件:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NETVS2013Office转PDF发布时间:2022-07-10
下一篇:
Asp.NetMVC&amp;&amp;SmartDAL项目实践(二)简单结构搭建发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap