AutoFac使用总结

注册部分
使用RegisterType进行注册

[csharp] view plaincopy
[Fact]  
  
    public void can_resolve_myclass()  
  
    {  
  
        var builder = new ContainerBuilder();  
  
        builder.RegisterType<MyClass>();  
  
   
  
        IContainer container = builder.Build();  
  
        var myClass = container.Resolve<MyClass>();  
  
        Assert.NotNull(myClass);  
  
    }

注册为接口

[csharp] view plaincopy
[Fact]  
    public void register_as_interface()  
    {  
        var builder = new ContainerBuilder();  
        builder.Register(c => new MyClass()).As<MyInterface>();  
  
        IContainer container = builder.Build();  
        Assert.NotNull(container.Resolve<MyInterface>());  
        Assert.Throws(typeof (ComponentNotRegisteredException), () => container.Resolve<MyClass>());  
    }

使用lambda表达式进行注册

[csharp] view plaincopy
[Fact]  
    public void can_register_with_lambda()  
    {  
        var builder = new ContainerBuilder();  
        builder.Register(c => new MyClass());  
  
        IContainer container = builder.Build();  
        var myClass = container.Resolve<MyClass>();  
        Assert.NotNull(myClass);  
    }

带构造参数的注册

[csharp] view plaincopy
[Fact]  
    public void register_with_parameter()  
    {  
        var builder = new ContainerBuilder();  
        builder.Register(c => new MyParameter());  
        builder.Register(c => new MyClass(c.Resolve<MyParameter>()));  
        IContainer container = builder.Build();  
        Assert.NotNull(container.Resolve<MyClass>());  
    }

带属性赋值的注册

[csharp] view plaincopy
[Fact]  
    public void register_with_property()  
    {  
        var builder = new ContainerBuilder();  
        builder.Register(c => new MyProperty());  
        builder.Register(  
            c => new MyClass()  
                     {  
                         Property = c.Resolve<MyProperty>()  
                     });  
        IContainer container = builder.Build();  
        var myClass = container.Resolve<MyClass>();  
        Assert.NotNull(myClass);  
        Assert.NotNull(myClass.Property);  
    }

Autofac分离了类的创建和使用,这样可以根据输入参数(NamedParameter)动态的选择实现类。

[csharp] view plaincopy
[Fact]  
    public void select_an_implementer_based_on_parameter_value()  
    {  
        var builder = new ContainerBuilder();  
        builder.Register<IRepository>((c, p) =>  
                             {  
                                 var type = p.Named<string>("type");  
                                 if (type == "test")  
                                 {  
                                     return new TestRepository();  
                                 }  
                                 else  
                                 {  
                                     return new DbRepository();  
                                 }  
                             }).As<IRepository>();  
  
        IContainer container = builder.Build();  
        var repository = container.Resolve<IRepository>(new NamedParameter("type", "test"));  
        Assert.Equal(typeof(TestRepository),repository.GetType());  
    }

AufoFac也可以用一个实例来注册,比如用在单例模式情况下:

[csharp] view plaincopy
[Fact]  
    public void register_with_instance()  
    {  
        var builder = new ContainerBuilder();  
        builder.RegisterInstance(MyInstance.Instance).ExternallyOwned();  
        IContainer container = builder.Build();  
        var myInstance1 = container.Resolve<MyInstance>();  
        var myInstance2 = container.Resolve<MyInstance>();  
        Assert.Equal(myInstance1,myInstance2);  
    }

注册open generic类型

[csharp] view plaincopy
[Fact]  
    public void register_open_generic()  
    {  
        var builder = new ContainerBuilder();  
        builder.RegisterGeneric(typeof (MyList<>));  
        IContainer container = builder.Build();  
        var myIntList = container.Resolve<MyList<int>>();  
        Assert.NotNull(myIntList);  
        var myStringList = container.Resolve<MyList<string>>();  
        Assert.NotNull(myStringList);  
    }

对于同一个接口,后面注册的实现会覆盖之前的实现

[csharp] view plaincopy
[Fact]  
    public void register_order()  
    {  
        var containerBuilder = new ContainerBuilder();  
        containerBuilder.RegisterType<DbRepository>().As<IRepository>();  
        containerBuilder.RegisterType<TestRepository>().As<IRepository>();  
  
        IContainer container = containerBuilder.Build();  
        var repository = container.Resolve<IRepository>();  
        Assert.Equal(typeof(TestRepository), repository.GetType());  
    }

如果不想覆盖的话,可以用PreserveExistingDefaults,这样会保留原来注册的实现。

[csharp] view plaincopy
[Fact]  
    public void register_order_defaults()  
    {  
        var containerBuilder = new ContainerBuilder();  
        containerBuilder.RegisterType<DbRepository>().As<IRepository>();  
        containerBuilder.RegisterType<TestRepository>().As<IRepository>().PreserveExistingDefaults();  
  
        IContainer container = containerBuilder.Build();  
        var repository = container.Resolve<IRepository>();  
        Assert.Equal(typeof (DbRepository), repository.GetType());  
    }

可以用Name来区分不同的实现,代替As方法

[csharp] view plaincopy
[Fact]  
    public void register_with_name()  
    {  
        var containerBuilder = new ContainerBuilder();  
        containerBuilder.RegisterType<DbRepository>().Named<IRepository>("DB");  
        containerBuilder.RegisterType<TestRepository>().Named<IRepository>("Test");  
  
        IContainer container = containerBuilder.Build();  
        var dbRepository = container.ResolveNamed<IRepository>("DB");  
        var testRepository = container.ResolveNamed<IRepository>("Test");  
        Assert.Equal(typeof(DbRepository), dbRepository.GetType());  
        Assert.Equal(typeof(TestRepository), testRepository.GetType());  
    }  
如果一个类有多个构造函数的话,可以在注册时候选择不同的构造函数

[csharp] view plaincopy
[Fact]  
    public void choose_constructors()  
    {  
        var builder = new ContainerBuilder();  
        builder.RegisterType<MyParameter>();  
        builder.RegisterType<MyClass>().UsingConstructor(typeof (MyParameter));  
        IContainer container = builder.Build();  
        var myClass = container.Resolve<MyClass>();  
        Assert.NotNull(myClass);  
    }

AutoFac可以注册一个Assemble下所有的类,当然,也可以根据类型进行筛选

[csharp] view plaincopy
[Fact]  
    public void register_assembly()  
    {  
        var builder = new ContainerBuilder();  
        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).  
            Where(t => t.Name.EndsWith("Repository")).  
            AsImplementedInterfaces();  
  
        IContainer container = builder.Build();  
        var repository = container.Resolve<IRepository>();  
        Assert.NotNull(repository);

}

注:如果你要想实现autofac的自动属性注入,在属性所在的class中,也要注册到autofac中,获取属性所在的class的实例必须通过autofac获取,也就是绝对不要通过new来获取,因为autofac的存在就是为了让你在一定程度上减少new的使用。

时间: 2024-10-14 18:53:14

AutoFac使用总结的相关文章

AutoFac Asp.Net Mvc

autofac依赖注入,帮我们实例化接口,无需使用传统的New 如: public class AutoFacController : Controller { public IPeople _people; public AutoFacController(IPeople people) { _people = people; } // GET: AutoFac public ActionResult Index() { ViewBag.test = _people.Getpeople();

[转]依赖注入框架Autofac的简单使用

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://code.google.com/p/autofac/downloads/list 1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,这也是本篇文章重点使用的Autofac的类库. 2)创建一个控制台工程,并且引用以上的DLL文件.创建一个数据库操作接

【翻译Autofac的帮助文档】1.入门指南

[写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规划你的应用程序 在你的Porject中添加Autofac引用 按照如下步骤设计应用程序的启动环节 创建一个ContainerBuilder 向ContainerBuilder注册组件 通过ContainerBuilder的Build()方法获得Container(后续需用到) 在应用程序运行环节时,

用Autofac实现MVC5的IoC控制反转方法

Autofac跟Ninject一样,都是用于IOC,实现依赖注入的.主要有两个步骤,其余跟Ninject差不多. 1.主要的操作是在MVC项目下的Infrastructure(基础结构/公共建设)文件夹下,新建一人注册Autofac的IOC的类 namespace BookShop.WebUI.Infrastructure { public class AutofacReg { public static void RegisterDenpendencies() { var build = ne

问题:IIS部署 MVC项目 (autofac) 错误解决

http://www.cnblogs.com/yelaiju/p/3375168.html Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题 在部署到iis的时候会出现这个状况. 解决:下载安装这个补丁 http://support.microsoft.com/kb/2468871 http://www.microsoft.com/zh-cn/download/confirmation.aspx

NET Core 整合Autofac和Castle

NET Core 整合Autofac和Castle 阅读目录 前言: 1.ASP.NET Core中的Autofac 2.整合Castle的DynamicProxy 3.注意事项 回到目录 前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 回到目录 1.ASP.NET Core中的Autofac 首先在Project.json的Dependency节点为中添

autofac v4.0+通过配置文件的方式注册组件

最近在看李玉宝 / OpenAuth.Net的项目代码,新手表示看不懂.所以,不管三七二十一,模仿是最好的学习,于是我决定自己创建一个项目,把人家的代码一点一点拷贝过来,细细品味. 在研究的过程中,我发现大神用autofac是通过配置文件的方式.Autofac.Configuration的版本是V3.3,然后我创建的项目用的是V4.0.1. 本来是想用代码注册组件的,但是以看到大神是通过配置文件注册的,于是乎,不管三七二十一,我就定下了一个小目标,我要用v4.0.1版本来完成使用配置文件的方式来

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

Autofac 结合 Castle DynamicProxy2 功能 Autofac 不仅作为轻量级高效的 IoC 容器,而且还能很好的与 Castle.DynamicProxy2 结合起来,实现 AOP 功能. 首先,我们需要定义拦截器,简单的定义可实现 Castle.DynamicProxy.IInterceptor 接口即可. 添加拦截器   定义好了拦截器后,如何应用到相关对象呢?有两种方式: 1)使用 Autofac.Extras.DynamicProxy2.InterceptAttr

浅析依赖注入框架Autofac的使用

Autofac是一款IOC框架,比起Spring.NET,Unity,Castle等等框架,它很轻量级且性能也很高,下面小编给大家介绍下依赖注入框架Autofac的使用. 下面通过代码给大家分享下依赖注入框架Autofac的使用,具体如下所示:  Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的. 1)解压它的压缩包,主要看到Autofac.dll,Autofac.Configuration.dll,

IoC容器Autofac正篇之依赖注入(六)

依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物注入到病人体内.注入也就是由外向内注入.灌输一些东西. 综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化. 三种注入方式 一.构造器注入   类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入 cl