AutofacNet 最后整理
方案1 MVC+三层架构
1,新建三层架构(BLL,DAL,UI)
2,在DAL 及 BLL 中均使用接口Interface及实现Realization
3,在BLL 中的类中,使用构造函数 如类名SysUser,均使用接口进行传值
public DataAccessLayer.Interface.ISysUser dal;
public SysUser(DataAccessLayer.Interface.ISysUser sysUser)
{
dal = sysUser;
}
4,在方法中,可直接使用dal 进行方法的调用
5,类似于BLL 层的调用方式,在Contrallor 中,也是需要调用BLL层的接口进行调用
BusinessLogicLayer.Interface.ISysUser _sysUser;
public HomeController(BusinessLogicLayer.Interface.ISysUser sysUser)
{
_sysUser = sysUser;
}
6,这时候如果直接调式MVC 项目,项目会报错,提示控制器没有无参构造
以下重点
7,在MVC 项目中调用Nuget 进行安装autofac ,包括(autofac,Mvc5=>会引用 Autofac.Integration.Mvc)
8,在MVC 下 App_Start 文件夹内新建 AutoFacConfig.cs ,内容如下:
using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
namespace Dean.WebMVC
{
public class AutoFacConfig
{
public static void Register()
{
//配置 Autofac 基本信息
//创建容器
ContainerBuilder builder = new ContainerBuilder();
//第一种方法 使用构造依赖注入
//builder.RegisterType<Domain.BusinessLogicLayer.Realization.SysUser>().As<Domain.BusinessLogicLayer.Interface.ISysUser>();
//builder.RegisterType<Domain.DataAccessLayer.Realization.SysUser>().As<Domain.DataAccessLayer.Interface.ISysUser>();
//第二种方法 使用反射注入 实现直接配置程序集
Assembly dal = Assembly.Load("Dean.DataAccessLayer");//通过反射找到对应的dal成功
builder.RegisterAssemblyTypes(dal).AsImplementedInterfaces();//通过容器注射反射等得到类型,并且与接口层进行关联
Assembly bll = Assembly.Load("Dean.BusinessLogicLayer");//通过反射找到对应的dal成功
builder.RegisterAssemblyTypes(bll).AsImplementedInterfaces();//通过容器注射反射等得到类型,并且与接口层进行关联
//注册控制器
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//构建
Autofac.IContainer container = builder.Build();
//实现
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}
9,说明。有五个步骤:
- 创建容器
- 依赖注入
第一种方法适合类较少的应用,可针对性的进行配置。
第二种方法适合类多的,比较快速方便的整理,建议使用。
//第一个参数是实现类,后面是的接口
builder.RegisterType<Domain.BusinessLogicLayer.Realization.SysUser>()
.As<Domain.BusinessLogicLayer.Interface.ISysUser>();
//第一个参数是实现类,后面是的接口
builder.RegisterType<Domain.DataAccessLayer.Realization.SysUser>()
.As<Domain.DataAccessLayer.Interface.ISysUser>();
//第二种方法 使用反射注入 实现直接配置程序集
//通过反射找到对应的dal成功
Assembly dal = Assembly.Load("Dean.DataAccessLayer");
//通过容器注射反射等得到类型,并且与接口层进行关联
builder.RegisterAssemblyTypes(dal).AsImplementedInterfaces();
//通过反射找到对应的bll成功
Assembly bll = Assembly.Load("Dean.BusinessLogicLayer");
//通过容器注射反射等得到类型,并且与接口层进行关联
builder.RegisterAssemblyTypes(bll).AsImplementedInterfaces();
- 注册控制器
- 构建
- 实现
10,保存好文件,打开MVC 下的 Global.asax 进行注册,这里重要,如果不注册,则无法生效。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace Dean.WebMVC
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoFacConfig.Register();//autofac:控制反转,依赖注入配置
}
}
}
方案2 WebAPI + Domain
后面发现其实这个方法是可以运用到WEBAPI+MVC 的,
只是引用的dll 不同,引用完之后使用同样的方法将数据
- 引用 Autofac
- 引用 Autofac.Mvc4 or 5
- 引用 Autofac.WebApi2
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
using System;
using System.Reflection;
using System.Web.Http;
using System.Web.Mvc;
private static IContainer _container;
/// <summary>
///
/// </summary>
public static void Register()
{
#region AutoFac IOC容器
try
{
//配置 Autofac 基本信息
//创建容器
ContainerBuilder builder = new ContainerBuilder();
//配置程序集
Assembly Repository = Assembly.Load("Dean.WebApi.Repository");//通过反射找到对应的 Repository 成功
builder.RegisterAssemblyTypes(Repository).AsImplementedInterfaces();//通过容器注射反射等得到类型,并且与接口层进行关联
//注册控制器
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
//构建
//Autofac.IContainer _container = builder.Build();
_container = builder.Build();
//设置MVC依赖注入
DependencyResolver.SetResolver(new AutofacDependencyResolver(_container));
//设置WebApi依赖注入
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(_container);
}
catch (Exception ex)
{
throw new Exception(ex.Message + "\n" + ex.InnerException);
}
#endregion
}
同样在 Global.asax Application_Start 做配置注册