使用 Caliburn Micro 向 SimpleContainer 注册 IMemoryCache
Register IMemoryCache with SimpleContainer using Caliburn Micro
我已经将 IMemoryCache
(Microsoft.Extensions.Cachine.Memory 3.1.5) 的一个实例注册为具有 SimpleContainer
的单例,以便与 Caliburn Micro 一起用于我的 WPF 应用程序我在 .Net Core 3.1 中写作。
在我的引导程序中,我有以下代码
public class Bootstrapper : BootstrapperBase
{
private SimpleContainer _container = new SimpleContainer();
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Singleton<IMemoryCache, MemoryCache>();
}
当我在 class 中使用 IMemoryCache
时,它抛出异常,因为它需要 MemoryCacheOptions
传递到 MemoryCache 的构造函数中。
我已尝试将 MemoryCacheOptions 添加到 Singleton 注册中,但未被接受。
这是我的 ReferenceDataHelper
class 的构造函数,我试图在其中注入 IMemoryCache,它在构造 ReferenceDataHelper class 时失败并显示 System.Reflection.TargetInvocationException
.
public class ReferenceDataHelper : IReferenceDataHelper
{
private IMemoryCache _memoryCache;
private IReferenceDataHandler _referenceDataHandler;
public ReferenceDataHelper(IReferenceDataHandler referenceDataHandler, IMemoryCache memoryCache)
{
_referenceDataHandler = referenceDataHandler;
_memoryCache = memoryCache;
}
我不知道如何设置 - 谁能提供一些帮助?
谢谢!
我想我已经找到了解决方案,但我不确定这是否是解决问题的最佳方法。
我创建了一个实现 IMemoryCache 的包装器,在此 class 我实例化了一个新的 MemoryCache 对象并传入了 MemoryCacheOptions。
public class ReferenceDataMemoryCache : IMemoryCache
{
private MemoryCache memoryCache;
public ReferenceDataMemoryCache()
{
MemoryCacheOptions memoryCacheOptions = new MemoryCacheOptions();
memoryCache = new MemoryCache(memoryCacheOptions);
}
public ICacheEntry CreateEntry(object key)
{
return memoryCache.CreateEntry(key);
}
public void Dispose()
{
memoryCache.Dispose();
}
public void Remove(object key)
{
memoryCache.Remove(key);
}
public bool TryGetValue(object key, out object value)
{
return memoryCache.TryGetValue(key, out value);
}
}
我更新了 Bootstrapper 以使用我的包装器注册单例 class。
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Singleton<IMemoryCache, MemoryCache>();
}
虽然这可行,但如果这是一个更大的 class(IMemoryCache 有少量要实现的方法),将 MemoryCacheOptions 传递给构造函数感觉需要做很多额外的工作。
如果有人对这种方法有想法,我们将不胜感激。
您可以自己创建一个实例,然后将该实例注册到容器中。
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Instance<IMemoryCache>(new MemoryCache(new MemoryCacheOptions()));
}
提供给容器的实例实际上是一个单例,因为容器只会提供您给它的实例。向容器提供实例的好处是您可以控制对象的创建方式。
我已经将 IMemoryCache
(Microsoft.Extensions.Cachine.Memory 3.1.5) 的一个实例注册为具有 SimpleContainer
的单例,以便与 Caliburn Micro 一起用于我的 WPF 应用程序我在 .Net Core 3.1 中写作。
在我的引导程序中,我有以下代码
public class Bootstrapper : BootstrapperBase
{
private SimpleContainer _container = new SimpleContainer();
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Singleton<IMemoryCache, MemoryCache>();
}
当我在 class 中使用 IMemoryCache
时,它抛出异常,因为它需要 MemoryCacheOptions
传递到 MemoryCache 的构造函数中。
我已尝试将 MemoryCacheOptions 添加到 Singleton 注册中,但未被接受。
这是我的 ReferenceDataHelper
class 的构造函数,我试图在其中注入 IMemoryCache,它在构造 ReferenceDataHelper class 时失败并显示 System.Reflection.TargetInvocationException
.
public class ReferenceDataHelper : IReferenceDataHelper
{
private IMemoryCache _memoryCache;
private IReferenceDataHandler _referenceDataHandler;
public ReferenceDataHelper(IReferenceDataHandler referenceDataHandler, IMemoryCache memoryCache)
{
_referenceDataHandler = referenceDataHandler;
_memoryCache = memoryCache;
}
我不知道如何设置 - 谁能提供一些帮助? 谢谢!
我想我已经找到了解决方案,但我不确定这是否是解决问题的最佳方法。
我创建了一个实现 IMemoryCache 的包装器,在此 class 我实例化了一个新的 MemoryCache 对象并传入了 MemoryCacheOptions。
public class ReferenceDataMemoryCache : IMemoryCache
{
private MemoryCache memoryCache;
public ReferenceDataMemoryCache()
{
MemoryCacheOptions memoryCacheOptions = new MemoryCacheOptions();
memoryCache = new MemoryCache(memoryCacheOptions);
}
public ICacheEntry CreateEntry(object key)
{
return memoryCache.CreateEntry(key);
}
public void Dispose()
{
memoryCache.Dispose();
}
public void Remove(object key)
{
memoryCache.Remove(key);
}
public bool TryGetValue(object key, out object value)
{
return memoryCache.TryGetValue(key, out value);
}
}
我更新了 Bootstrapper 以使用我的包装器注册单例 class。
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Singleton<IMemoryCache, MemoryCache>();
}
虽然这可行,但如果这是一个更大的 class(IMemoryCache 有少量要实现的方法),将 MemoryCacheOptions 传递给构造函数感觉需要做很多额外的工作。
如果有人对这种方法有想法,我们将不胜感激。
您可以自己创建一个实例,然后将该实例注册到容器中。
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Instance<IMemoryCache>(new MemoryCache(new MemoryCacheOptions()));
}
提供给容器的实例实际上是一个单例,因为容器只会提供您给它的实例。向容器提供实例的好处是您可以控制对象的创建方式。