Autofac(01)
目录:
- 控制反转
- 依赖注入
- Autofac的使用
1.控制反转
1.1耦合
多重依赖关系,在对象和各模块都会出现。一个类知道交互类的大量信息就是高耦合,修改这个类就容易破坏交互类
1.2降低耦合
- 在两块代码之间引入抽象层
public interface IMessageService { void SendMessage(); } public class EmailService : IMessageService { public void SendMessage() { Console.WriteLine("通过电子邮件发送消息"); } } public class MessageManager { private IMessageService msgService; public MessageManager() { msgService=new EmailService(); } public void SendMsg() { msgService.SendMessage(); } }
- 把选择抽象实现的责任移除到消费者的外部
需要把EmailService类的创建移到MessageManager类的外面。
1.3控制反转
把依赖移除到依赖类的外部,称为控制反转。是抽象的,只表示移除
2.依赖注入
依赖注入是一种控制反转的形式,注入方式通常采用两种:
- 构造函数注入
只需存储一个接口,不需依赖项
public class MessageManager
{
private IMessageService msgService;
public MessageManager(IMessaageService service)
{
msgService=service;
}
public void SendMsg()
{
msgService.SendMessage();
}
}
- 属性注入
设置对象上的公共属性
public class MessageManager
{
public IMessageService msgService {get; set;}
public void SendMsg()
{
if (msgService ==null)
{
Throw new InvalidOperationException();
}
msgService.SendMessage();
}
}
3.依赖注入框架
Autofac是一款IOC容器框架,轻量级,性能高。
3.1Autofac的使用
- 安装Autofac
// 数据源操作接口 public interface IDataSource { // 获取数据 string GetData(); } // SQLSERVER数据库 public class Sqlserver : IDataSource { public string GetData() { return "通过SQLSERVER获取数据"; } } // ORACLE数据库 public class Oracle : IDataSource { public string GetData() { return "通过Oracle获取数据"; } } /// 数据源管理类 public class DataSourceManager { IDataSource _ds; // 根据传入的类型动态创建对象 public DataSourceManager(IDataSource ds) { _ds = ds; } public string GetData() { return _ds.GetData(); } } static void Main(string[] args) { //获取Autofac容器构造器 var builder = new ContainerBuilder(); // 注册类型 builder.RegisterType<DataSourceManager>(); // 注册实例(即将SqlServer类型注册为IDataSource的实例 builder.RegisterType<Sqlserver>().As<IDataSource>(); // 由构造器创建Ioc容器 using (var container = builder.Build()) { // 解析实例 var manager = container.Resolve<DataSourceManager>(); Console.WriteLine(manager.GetData()); Console.ReadLine(); } }
- 其他用法:
①注册多个接口
builder.RegisterType<Sqlserver>().AsImplementedInterfaces();
②利用反射注册
Assembly asm = Assembly.Load("DAL.BLL");builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();
我们可以在配置文件中将程序集信息在<appSettings>节点中进行配置,来减少对程序集的引用,彻底解除耦合。
③利用属性注入 注册
Assembly asm = Assembly.Load("DAL.BLL");builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();
④一个接口多个实现
Assembly asm = Assembly.Load("DAL.BLL");
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();
using (var container = builder.Build())
{
IEnumerable<IDataSource> dals =
container.Resolve<IEnumerable<IDataSource>>();
foreach(var dal in dals)
{
Console.WriteLine(dal.GetData());
}
Console.ReadLine();
}
//也可以通过Named()方法在指定要想获取的类型。
//获取Autofac容器构造器
var builder = new ContainerBuilder();
// 注册类型
builder.RegisterType<DataSourceManager>();
// 注册实例
builder.RegisterType<Sqlserver>().Named<IDataSource>("SqlServer");
builder.RegisterType<Sqlserver>().Named<IDataSource>("Oracle");
// 由构造器创建Ioc容器
using (var container = builder.Build())
{
// 解析实例
var manager = container.ResolveNamed<DataSourceManager>("SqlServer");
Console.WriteLine(manager.GetData());
Console.ReadLine();
}
3.2通过配置方式使用Autofac
通过配置实现Autofac 需要添加对Autofac.Configuration.dll的引用。
配置文件 <configuration> <configSections> <section name="autofac" type="Autofac.Configuration.SectionHandler,Autofac.Configuration"></section> </configSections> <autofac defaultAssembly="AutoFacDemo"> <components> <component type="AutoFacDemo.Model.Oracle,AutoFacDemo" service="AutoFacDemo.Model.IDataSource" /> </components> </autofac> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration> C#代码 var builder = new ContainerBuilder(); builder.RegisterType<DataSourceManager>(); builder.RegisterModule( new ConfigurationSettingsReader("autofac" ));
4.在Asp.net Mvc中使用Autofac
- 安装
- 创建配置类
public class AutofacConfig { public static void Register() { var builder = new ContainerBuilder(); //加载当前程序集 Assembly controllerAss = Assembly.GetExecutingAssembly(); //Assembly controllerAss = Assembly.Load("OA.Web"); //注册所有的Controller builder.RegisterControllers(controllerAss).PropertiesAutowired(); //注册数据访问层程序集 Assembly resAss = Assembly.Load("OA.DAL"); builder.RegisterTypes(resAss.GetTypes()).AsImplementedInterfaces(); //注册业务层程序集 Assembly bllAss = Assembly.Load("OA.BLL"); builder.RegisterTypes(bllAss.GetTypes()).AsImplementedInterfaces(); var container = builder.Build(); //当mvc创建controller对象的时候,都是由AutoFac为我们创建 //Controller对象 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } }
- 注册自己的控制类
在Global.asax 的Application_Start() 注册自己的控制器类
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//Autofac配置
AutofacConfig.Register();
}
至此,在MVC中使用 Autofac 的配置步骤完成。
在Controller中的使用如下:
public class HomeController :Controller
{
public IDataSource dataSource { get ; set; }
public ActionResult Index( )
{
var data = dataSource.GetData( );
return View(data);
}
}