博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoFac使用方法总结:Part I
阅读量:4538 次
发布时间:2019-06-08

本文共 6162 字,大约阅读时间需要 20 分钟。

转:

 

AutoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系。在使用方面主要是register和resolve两类操作。 这篇文章用单元测试的形式列举了AutoFac的常用使用方法:

注册部分

使用RegisterType进行注册

123456 7 8 9 10
[Fact]    public void can_resolve_myclass() { var builder = new ContainerBuilder(); builder.RegisterType
(); IContainer container = builder.Build(); var myClass = container.Resolve
(); Assert.NotNull(myClass); }

注册为接口

123456 7 8 9 10
[Fact]    public void register_as_interface() { var builder = new ContainerBuilder(); builder.Register(c => new MyClass()).As
(); IContainer container = builder.Build(); Assert.NotNull(container.Resolve
()); Assert.Throws(typeof (ComponentNotRegisteredException), () => container.Resolve
()); }

 

使用lambda表达式进行注册

123456 7 8 9 10
[Fact]    public void can_register_with_lambda() { var builder = new ContainerBuilder(); builder.Register(c => new MyClass()); IContainer container = builder.Build(); var myClass = container.Resolve
(); Assert.NotNull(myClass); }

带构造参数的注册

123456 7 8 9
[Fact]    public void register_with_parameter() { var builder = new ContainerBuilder(); builder.Register(c => new MyParameter()); builder.Register(c => new MyClass(c.Resolve
())); IContainer container = builder.Build(); Assert.NotNull(container.Resolve
()); }

带属性赋值的注册

123456 7 8 9 10 11 12 13 14 15
[Fact]    public void register_with_property() { var builder = new ContainerBuilder(); builder.Register(c => new MyProperty()); builder.Register( c => new MyClass() { Property = c.Resolve
() }); IContainer container = builder.Build(); var myClass = container.Resolve
(); Assert.NotNull(myClass); Assert.NotNull(myClass.Property); }

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

123456 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[Fact]    public void select_an_implementer_based_on_parameter_value() { var builder = new ContainerBuilder(); builder.Register
((c, p) => { var type = p.Named
("type"); if (type == "test") { return new TestRepository(); } else { return new DbRepository(); } }).As
(); IContainer container = builder.Build(); var repository = container.Resolve
(new NamedParameter("type", "test")); Assert.Equal(typeof(TestRepository),repository.GetType()); }

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

123456 7 8 9 10
[Fact]    public void register_with_instance() { var builder = new ContainerBuilder(); builder.RegisterInstance(MyInstance.Instance).ExternallyOwned(); IContainer container = builder.Build(); var myInstance1 = container.Resolve
(); var myInstance2 = container.Resolve
(); Assert.Equal(myInstance1,myInstance2); }

注册open generic类型

123456 7 8 9 10 11
[Fact]    public void register_open_generic() { var builder = new ContainerBuilder(); builder.RegisterGeneric(typeof (MyList<>)); IContainer container = builder.Build(); var myIntList = container.Resolve
>(); Assert.NotNull(myIntList); var myStringList = container.Resolve
>(); Assert.NotNull(myStringList); }

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

123456 7 8 9 10 11
[Fact]    public void register_order() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType
().As
(); containerBuilder.RegisterType
().As
(); IContainer container = containerBuilder.Build(); var repository = container.Resolve
(); Assert.Equal(typeof(TestRepository), repository.GetType()); }

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

123456 7 8 9 10 11
[Fact]    public void register_order_defaults() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType
().As
(); containerBuilder.RegisterType
().As
().PreserveExistingDefaults(); IContainer container = containerBuilder.Build(); var repository = container.Resolve
(); Assert.Equal(typeof (DbRepository), repository.GetType()); }

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

123456 7 8 9 10 11 12 13
[Fact]    public void register_with_name() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType
().Named
("DB"); containerBuilder.RegisterType
().Named
("Test"); IContainer container = containerBuilder.Build(); var dbRepository = container.ResolveNamed
("DB"); var testRepository = container.ResolveNamed
("Test"); Assert.Equal(typeof(DbRepository), dbRepository.GetType()); Assert.Equal(typeof(TestRepository), testRepository.GetType()); }

如果一个类有多个构造函数的话,可以在注册时候选择不同的构造函数

123456 7 8 9 10
[Fact]    public void choose_constructors() { var builder = new ContainerBuilder(); builder.RegisterType
(); builder.RegisterType
().UsingConstructor(typeof (MyParameter)); IContainer container = builder.Build(); var myClass = container.Resolve
(); Assert.NotNull(myClass); }

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

123456 7 8 9 10 11 12
[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
(); Assert.NotNull(repository); }

转载于:https://www.cnblogs.com/HouZhiHouJueBlogs/articles/4383897.html

你可能感兴趣的文章
asp.net mvc 伪静态添加
查看>>
EA类图与代码同步
查看>>
Android Studio 智能感知无效
查看>>
javascript 日常
查看>>
让插件帮你优化代码
查看>>
ng 动态的生成option。
查看>>
ORACLE-12C-RAC INSTALL
查看>>
自定义引用类型的Enumerable.Union调用(原创)
查看>>
抽象类实例
查看>>
react context prop-types
查看>>
Java之路——Java初接触
查看>>
2018.12.27学习JavaScript
查看>>
Cocoa编程开发者手册
查看>>
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
查看>>
理工之 A+B Problem III
查看>>
SalesForce自定义按钮(javascript执行),点击按钮更新Filed
查看>>
软件工程第一次作业
查看>>
【Android 界面效果24】Intent和PendingIntent的区别
查看>>
node学习之搭建服务器并加装静态资源
查看>>
android 按menu键解锁功能的开关
查看>>