我在說c# 3.5 3.0。 我知道如何做到這一點,當緩存或ServiceProvider可以只有一個實例的整個應用程序。在這種情況下的ServiceProvider可以這個樣子ServiceProvider,高速緩存等用泛型完成,無需投入
public static class Service<T>
{
public static T Value {get; set;}
}
,可以用於不同類型的像這樣:
Service<IDbConnection>.Value = new SqlConnection("...");
Service<IDesigner>.Value = ...;
//...
IDbCommand cmd = Service<IDbConnection>.Value.CreateCommand();
靜態緩存也很容易:
public static class Cache<T>
{
private static Dictionary<int, T> cache = new Dictionary<int, T>();
public static void Add(int key, T value)
{
cache.Add(key, value);
}
public static T Find(int key)
{
return cache[key];
}
}
,並可以像使用這個:
Cache<string>.Add(1, "test");
Cache<DateTime>.Add(2, DateTime.Now);
//...
string found = Cache<string>.Find(1);
我的問題是:如何創建類似的緩存或服務提供程序,當我想有兩個或更多不同的每個實例。下面是示例代碼,我要如何使用服務提供商:
ServiceProvider provider = new ServiceProvider();
provider.Add<IDbConnection>(new SqlConnection("..."));
provider.Add<IDesigner>(...);
//...
ServiceProvider provider1 = new ServiceProvider();
provider1.Add<IDbConnection>(new SqlConnection("..."));
//...
//...
IDbCommand cmd1 = provider.GetService<IDbConnection>().CreateCommand();
IDbCommand cmd2 = provider1.GetService<IDbConnection>().CreateCommand();
,我在我的頭使用鑄造,我想避免的唯一實現。
public class ServiceProvider
{
private Dictionary<Type, object> services = new Dictionary<Type, object>();
public void Add<T>(T value)
{
services.Add(typeof(T), value);
}
public T GetService<T>()
{
return (T) services[typeof (T)];
}
}
考慮一下,這是一個非常常見的問題。我認爲有必要實現一個完全封裝這個部分的類型(字典添加/查找),以便將演員嚴格限制在單個類中。將實驗今晚並撰寫博客條目... – 2008-10-07 13:07:29
從我在互聯網上發現的測試中看來,通用版本的代碼通常比使用演職員表的代碼快4-5倍。我認爲這是一個很好的理由來調查這一點,緩存是一個很好的代碼示例,可以從中受益。 – SeeR 2008-10-07 13:43:15