使用 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()));
}

提供给容器的实例实际上是一个单例,因为容器只会提供您给它的实例。向容器提供实例的好处是您可以控制对象的创建方式。