我在winform中采用了Autofac,然后用Microsoft.Practices.ServiceLocation.dll中的ServiceLocator注入。封装成一个类库,供其他的dll调用,我采用了UnitOfWork和repository模式,现在遇到的问题是,我对数据库做成修改后,提交后成功,但是数据库没更新修改。跟踪后发现的问题是,调用的数据工厂不是同个实例。在adp.net中用DependencyResolver.SetResolver这个去创建就没问题。在winform中我用ServiceLocator.Current.GetInstance去调用,它就会创建新的数据工厂实例!help!
用Autofac注册后,在用Common Service Locator,实现 ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(container))。但是我要创建的实例,构造函数参数有个数据工厂,用 ServiceLocator.Current.GetInstance去创建这个实例,工厂这个参数都每次不同。也即是说,b和c这两个类构造都引用a。现在我要创建d,d中构造函数引用了b和c,正确的情况是b和c创建的时候也是只用一个a的实例,但是现在确实b和c都各自创建了a的实例。不知道哪里的问题,找了很久。谢谢!
2012-7-27
直接封装了Autofac进行调用。还是出现之前这种症状!头爆了!
看你代码真复杂,IoC创建实例的四种模式:单例,每线程一实例,每调用一实例,每调用一实例(弱引用),当然你还可以扩展实例生命周期的管理策略。
所以你的想想 ServiceLocator 中如何管理实例的生命周期的,又或者你是如何定义你的对象的实例的生命周期的。
能否说的详细点,还是有参考的链接,发一个谢谢!
@CookBlack: 我一直使用的是Unity,没用过你说的Autofac,不过我发现一篇博文,其中的回帖中也提到了实例管理:
@程序猿.码农: 这个在之前就在园里看过了!我现在有点乱,自己还在找原因。可能定义的框架有点问题。还是谢谢!自己在找找原因!
@CookBlack:亲,,你实现了嘛,可以提供下方法吗?