以这种方式使用可丢弃对象时要记住的事情是容器中的引用也会被丢弃,所以最好在通过Resolve返回实例时它需要每次都返回一个新实例。
你需要做的,就是注册时的类型与你的容器,允许它指定的行为,无论是共享(单身),或者非共享,如:
Container.RegisterType<IDisposableObject>(CreationPolicy.NonShared);
using (var disposable = Container.Resolve<IDisposableObject>()) {
}
以上将工作的非共享实例,因为每次都创建一个新实例,所以我们可以安全地处理它。如果您使用CreationPolicy = Shared来尝试上述操作,则Singleton将被丢弃,因此以后的访问可能会导致ObjectDisposedException。
通过,你可以通过传递的creationPolicy =共享创建辛格尔顿情况下,建立这种行为,例如:
Container.RegisterType<IUserRepository>(CreationPolicy.Shared);
using (var disposable = Container.Resolve<IDisposableObject>()) {
var userRepository = Container.Resolve<IUserRepository>();
// only one instance of user repository is created and persisted by the container.
}
希望帮助?
如果您以前使用过MEF,这个术语可能很熟悉。
编辑:所以,我的理解是,你想要做的事,如:
using (var repository = Container.Resolve<IUserRepository>())
{
var other = Container.Resolve<IUserRepository>();
// should resolve to the same instance.
}
你需要找到在容器监测一次性对象的某种方式。也许引进一个额外的创建策略,SharedScope,e.g:
Container.Register<IUserRepository, UserRepository>(CreationPolicy.SharedScope);
现在,当您使用容器解决型,你需要弄清楚的项目把creationPolicy。如果项目是SharedScope,并且尚未创建,请创建它的一个实例并返回。
如果您解析实例并且它已经创建,则返回现有实例。
当在该项目上调用Dispose时,需要一些回调容器的方法来移除实例。
编辑两个:
那么,有没有搞清楚了这一点的一个简单的方法。我能想到的唯一方法是你引入另一个接口:
public interface IMonitoredDisposable : IDisposable
{
bool IsDisposed { get; set; }
}
当一个对象被处置时,确保它设置了IsDisposed属性。那么您可以从您的容器中监控该财产吗?
那种答案我在找。我明白我需要通过某种“范围”。我只想知道如何从我的字典中删除单身人士,如果它已被丢弃?我想到的一种方式是使用(var localContainer = IoC.Create())'为每个“范围”创建一个新的容器,然后调用'localContainer.Resolve()'在本地执行解析... –
TheCloudlessSky
2010-06-30 18:29:23
那么,你不会处理单身人士,否则你将无法再返回他们。如果你的容器有一个Singletons的内部散列表,把它们存储在那里你可以很容易地抓住它们。如果要解析的类型未声明为Singleton,则只需通过Resolve <>将其返回而不存储它。 使用具有Disposable模式问题的容器将不会是一个好的举措,因为您每次都必须设置和创建容器...... – 2010-06-30 19:05:02
因此,如果您不处理Singleton,它们如何具体化到'使用'范围?因为它不被删除,所以散列表中的关键字总是会碰到相同的单身人士(处置或不处理)。我认为你错过了如果在using语句中调用Container.Resolve()*的问题,它应该引用从'using'范围创建的问题。 –
TheCloudlessSky
2010-06-30 21:05:55