您的位置:首页 > 编程语言 > ASP

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

2015-08-03 09:15 585 查看

一.前言

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

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

二.新建带有插件的项目

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

%26nbsp; %26nbsp; 项目结构如下图:

%26nbsp; %26nbsp;%26nbsp;

三.建立DomainServices类库

%26nbsp; %26nbsp;新建一个ITestService接口,代码如下:

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

%26nbsp; %26nbsp; 新建一个TestService类实现ITestService,代码如下:

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

public string GetMainData()
{
return "这是主项目获取的Services数据";
}
}
}

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

%26nbsp; %26nbsp; 1.主项目引用autofac、autofac.Integration.Mvc

%26nbsp; %26nbsp; %26nbsp; %26nbsp;工具-%26gt;库程序包管理器-%26gt;管理解决方案的NuGet程序包:

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

%26nbsp; %26nbsp; %26nbsp;代码如下:

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 =%26gt; t.Name.EndsWith("Service"))
.AsImplementedInterfaces().PropertiesAutowired();

//实现插件Controllers注入
var assemblies = new DirectoryInfo(
HttpContext.Current.Server.MapPath("~/App_Data/Plugins/"))
.GetFiles("*.dll")
.Select(r =%26gt; 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));
}
}
}

%26nbsp; %26nbsp; %26nbsp;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注入是否成功

%26nbsp; %26nbsp;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()
{

20000
ViewBag.Show = _service.GetMainData();
return View();
}
}
}

主项目的View代码:

@{
ViewBag.Title = "Home Page";
}

%26lt;div class="jumbotron"%26gt;
%26lt;h1%26gt;ASP.NET%26lt;/h1%26gt;
%26lt;p class="lead"%26gt;ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.%26lt;/p%26gt;
%26lt;p%26gt;%26lt;a href="http://asp.net" class="btn btn-primary btn-large"%26gt;Learn more %26amp;raquo;%26lt;/a%26gt;%26lt;/p%26gt;
%26lt;/div%26gt;

%26lt;div class="row"%26gt;
%26lt;p%26gt;这里是autofac注入的主项目:@ViewBag.Show %26lt;/p%26gt;
@Html.ActionLink("Demo插件内容访问点击这里", "Index", "Home", new { area = "Demo" }, null)
%26lt;/div%26gt;

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

%26nbsp; 注意: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代码:

%26lt;div%26gt;
%26lt;p%26gt;ASP.NET MVC 插件化:Plugin.Demo 内容%26lt;/p%26gt;
%26lt;p%26gt;autofac注入插件:@ViewBag.Show%26lt;/p%26gt;
%26lt;/div%26gt;

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

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

插件:

%26nbsp;







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: