如何强制Unity创建一个新实例?

10

在WCF上下文中,如何使用Unity应用程序块强制Unity配置在调用UnityContainer.Resolve<T>()方法时创建一个对象的新实例?


你正在使用哪个生命周期管理器?另外,你想要处理未托管的对象吗? - cuongle
我还没有配置生命周期管理器,我需要处理我的存储库对象。 - Andy Clark
你怎么知道你的仓储对象没有被释放? - cuongle
如果我手动更新数据库,它不会反映在Entity Framework中,而且我已经在Dispose方法中包含了一行代码,以记录该方法被调用的事实,并且日志文件没有被创建。 - Andy Clark
2
我明白了,Unity不支持为您调用Dispose,它只释放引用并让GC进行收集。对于大多数IoC,您需要手动处理disposing。 - cuongle
2个回答

11

Unity中的Lifetime Manager是您所需的一切。默认情况下,Unity使用TransientLifetimeManager

TransientLifetimeManager。对于此生命周期管理器,Unity为每次调用Resolve或ResolveAll方法创建并返回请求类型的新实例。除非指定其他生命周期管理器,否则此生命周期管理器默认用于使用RegisterType方法注册的所有类型。

如果需要使用其他生命周期管理器,请在Register方法中指定:

var container = new UnityContainer();
container.RegisterType<IMyType, MyType>(new PerResolveLifetimeManager()); 

2
使用RegisterType而没有指定LifetimeManager,会在每次注入时注入该类型的新实例。
来自MSDN
如果您没有为生命周期指定值,则该类型将被注册为瞬态生命周期,这意味着每次调用Resolve时都会创建一个新实例。

这个是可行的,但是当我在我的WCF应用程序中实现它时,它没有处理任何对象,有什么想法吗? - Andy Clark
@AndyClark Clark - 我们也在使用Unity 2.1.505,EF 4.3.1,采用存储库模式,在WCF服务层下运行,并进行了配置设置。一个不同之处可能是我们使用了WCF服务行为来引导?http://rafatolotti.wordpress.com/2010/09/12/wcf-unity-app-block/. - StuartLC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接