gpt4 book ai didi

c# - 泛型、接口(interface)和激活器

转载 作者:行者123 更新时间:2023-11-30 14:25:36 26 4
gpt4 key购买 nike

我正在开发一个内存缓存应用程序,它可以通过配置加载不同的缓存提供程序。我通过定义一个接口(interface)并使用插件模型加载程序集和类来执行此操作,该程序集和类解析文件并加载与接口(interface)匹配的类。我真的很想定义接口(interface)和一个通用类型,允许任何对象由后备缓存存储(无论是围绕第三方缓存客户端的包装器,如 Redis 或 NCache,还是我自己的 MemoryCache 实现等。)最终目标是拥有一个工厂,我可以指向一个包装我的缓存方法的 dll。

当我使用 Activator 尝试实例化插件时,我遇到的问题是有关泛型的错误。有谁知道用泛型将类加载到接口(interface)的方法吗?

基本界面

public interface ICacheProvider<T>
{
T Get(string key);
bool Set(string key, T value, TimeSpan expiration);
}

工厂调用加载

public static ICacheProvider<T> GetCacheProvider(string path, string className, string configuration)
{
...
Assembly asm = Assembly.LoadFile(path);
Type type = asm.GetType(className);

return Activator.CreateInstance(type, new object[] { configuration }) as ICacheProvider<T>;
...
}

最佳答案

抱歉,但我认为这不是好的设计(而且我知道这不是 CodeReview SE)。

ICacheProvider<T>不是很有用,因为其中没有任何内容需要为每个可缓存对象使用单独的类型。以下是 IMO,好多了,而且它让你免于 CreateInstance头痛:

public interface ICacheProvider
{
T Get<T>(string key);
bool Set<T>(string key, T value, TimeSpan expiration);
}

更进一步,我非常确定 ICacheProvider 的具体实现使用普通 object s,不管它们的具体类型如何。有了这个,您可以进一步简化您的契约(Contract):

public interface ICacheProvider
{
object Get(string key);
bool Set(string key, object value, TimeSpan expiration);
}

和几个扩展方法:

public static class CacheProviderExtensions
{
public static T Get<T>(this ICacheProvider cacheProvider, string key);
public static bool Set<T>(this ICacheProvider cacheProvider, string key,
T value, TimeSpan expiration);
}

现在,最常见的缓存操作之一是“获取或添加”行为,它可以表示为 ICacheProvider 上的另一种方法。 :

object GetOrSet(string key, Func<object> valueProvider, TimeSpan expiration)

关于c# - 泛型、接口(interface)和激活器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37703260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com