我想創建一個類,這是靈活的,所以我可以切換實現。使用構造函數依賴注入檢索文件的簡單工廠
問題:存儲文件/文件
選擇:要麼在服務器上的文件系統,數據庫存儲在本地或等
的人可以用類的骨架結構,以及如何我會叫它幫助嗎?
我沒有使用IoC,也不是真的想要。我只想要靈活性,我可能會在工廠更改一個代碼來調用另一個實現。
我想創建一個類,這是靈活的,所以我可以切換實現。使用構造函數依賴注入檢索文件的簡單工廠
問題:存儲文件/文件
選擇:要麼在服務器上的文件系統,數據庫存儲在本地或等
的人可以用類的骨架結構,以及如何我會叫它幫助嗎?
我沒有使用IoC,也不是真的想要。我只想要靈活性,我可能會在工廠更改一個代碼來調用另一個實現。
接口它。無論你需要存儲文件,只需要一個IFileStorer。如果您需要一種新的方式來存儲它,只需添加另一個IFileStorer類型。
interface IFileStorer
{
void Store(string file, byte[] data);
}
class LocalStorer : IFileStorer
{
void Store (string id, byte[] data)
{
//code to store locally
}
}
class DBStorer : IFileStorer
{
void Store (string id, byte[] data)
{
//code to store in db
}
}
class AnywhereStorer : IFileStorer
{
void Store (string id, byte[] data)
{
//code to store in anywhere
}
}
使用接口。
interface IStorage
{
void Save(string filename);
}
然後創建您的各種實現方式:
class LocalStorage : IStorage
{
void Save(string filename)
{
-implementation code-
}
}
,然後在你的消費類
+1。 LocalStorage類可能有一個字符串rootDirectory構造函數參數,而DatabaseStorage類可能需要一個存儲庫(或其他數據訪問類)等。 – 2009-12-17 20:03:46
我想補充一點已張貼別人,如果你想真的只是做一個改變,考慮一個靜態工廠:
public interface IFileStorage
{
void Store(); //parameters if needed
}
public class FileStorage : IFileStorage
{
public void Store(){}
}
public class DatabaseStorage : IFileStorage
{
public void Store(){}
}
然後,有一個枚舉,你將映射到具體類:
public enum FileStorageTypes
{
Database,
FileSystem
}
終於工廠:
public static class StorageFactory
{
public static IFileStorage GetStorage(FileStorageTypes types)
{
switch(types)
{
case FileStorageTypes.Database: return new DatabaseStorage();
case FileStorageTypes.FileSystem: return new FileStorage();
}
}
}
然後,如果你有地方在你的代碼,你需要做的一些存儲工作:
public void DoStorage(IFileStorage storage)
{
storage.Store();
}
你可以只調用這個方法:
DoStorage(StorageFactory.GetStorage(FileStorageTypes.Database));
如果需要,輕鬆將其交換出來。
+1可以使用配置文件獲取所需的配置文件,並且將來可以使用國際奧委會。 – CSharpAtl 2009-12-17 20:56:18
即使在使用IOC時也要使用接口.... – CSharpAtl 2009-12-17 20:03:09