新足迹

 找回密码
 注册

精华好帖回顾

· 新西兰南岛14天圣诞节房车图文游记 (2013-12-22) arthurchn · 简单的小点心--心太软 (2005-1-10) chris2002
· 不争气的眼泪又出来了 (2007-10-21) icewant · 请告诉我,真的有天堂 (2013-11-26) 美食杰
Advertisement
Advertisement
查看: 1302|回复: 13

AutoFac Construction Inject问题 [复制链接]

发表于 2011-8-15 17:21 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
AutoFac 的Construction Inject一定要手工注册的吗? 比如我有一个ClassA, 有一个接受IInterfact的构造函数, 我注册了IInterface的实例, 但是当我Resole ClassA的时候报错.一定要再注册一下=>new ClassA(c.resolve<IInterface>()). 这点Unity就比较好, 不用再注册ClassA了.
Advertisement
Advertisement

发表于 2011-8-15 17:29 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
really? 没用过unity,但感觉他们差不多,怎么都要register一下它denpendency的

发表于 2011-8-15 17:33 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你可以把dependency用attribute点缀一下,再application_start的时候,一次用linq加进来,不用手动register很多次。

发表于 2011-8-15 17:38 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个额外工作太多了. 好像没有Unity简洁阿. 我既然已经注册了IInterface了, 你就应该自动生成instance然后创建class阿, 还要手工写一个expression注册到AutoFac, 太啰嗦了

发表于 2011-8-15 17:46 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 huazhb 于 2011-8-15 16:38 发表
这个额外工作太多了. 好像没有Unity简洁阿. 我既然已经注册了IInterface了, 你就应该自动生成instance然后创建class阿, 还要手工写一个expression注册到AutoFac, 太啰嗦了


在unity中register interface就可以么?不用implementby? 如果有2个class implement这个interface怎么register?

发表于 2011-8-15 17:51 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不是太懂LZ的意思,你的情况,应该是先.RegisterType<IInterfactClass>().As<IInterfact>();.RegisterType<ClassA>()。 然后就直接Resolve ClassA了,classA会自己去AutoFac 中找到构造函数中的参数实现
Advertisement
Advertisement

发表于 2011-8-15 17:57 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2011-8-15 16:51 发表
不是太懂LZ的意思,你的情况,应该是先.RegisterType().As();.RegisterType()。 然后就直接Resolve ClassA了,classA会自己去AutoFac 中找到构造函数中的参数实现


new classA 让我也有点迷糊

发表于 2011-8-15 23:44 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
现在的关键是Constructor Injection。 ClassA的Constructor需要一个IInterface的参数, 在AutoFac中我需要同时注册IInterface和ClassA, 才能Resolve ClassA。 而在Unity中我只需要注册IInterface, 就可以直接Resolve ClassA, Unity会自动生成IInterface的参数传给ClassA的构造函数。

发表于 2011-8-15 23:48 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 huazhb 于 2011-8-15 22:44 发表
而在Unity中我只需要注册IInterface, 就可以直接Resolve ClassA, Unity会自动生成IInterface的参数传给ClassA的构造函数


你不register classA,可以以后resolve么?

发表于 2011-8-16 00:01 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
对啊, 就是可以直接Resolve ClassA。

发表于 2011-8-16 00:08 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 huazhb 于 2011-8-15 23:01 发表
对啊, 就是可以直接Resolve ClassA。


真的?这有点颠覆的意思了,强!!
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2011-8-18 18:51 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
问一个问题,IOC是不是要求整个dependency 链的最末端类必须有无参数的default constructor?

我有一个类,它的创建需要一个string作为必需的参数。也就是说,
如果那个string为空的话,最好不能够创建实例。

这种情况如何处理呢?

发表于 2011-8-18 20:09 |显示全部楼层
此文章由 huazhb 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huazhb 所有!转贴必须注明作者、出处和本声明,并保持内容完整
AutoFac可以在Reslove的时候传入参数的, http://code.google.com/p/autofac/wiki/ResolveParameters
头像被屏蔽

禁止发言

发表于 2011-8-19 10:04 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
哦。这个不错。我用的是MEF。我昨天晚上想通了。
在我的那个例子里,正确的做法有2种:

1. 用一个不需要参数的service来隔断classA和classB的关系。
这样单元测试时候可以mock service,然后返回那个需要参数的classB.

2或者可以允许classA来new classB,但是这样单元测试的单元就是
classA+classB。于是classB就需要根据单元测试的需要来切断
一些外部联系,比如数据库, web service什么的。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部