2009-12-17 65 views
1

我想創建一個類,這是靈活的,所以我可以切換實現。使用構造函數依賴注入檢索文件的簡單工廠

問題:存儲文件/文件
選擇:要麼在服務器上的文件系統,數據庫存儲在本地或等

的人可以用類的骨架結構,以及如何我會叫它幫助嗎?

我沒有使用IoC,也不是真的想要。我只想要靈活性,我可能會在工廠更改一個代碼來調用另一個實現。

+0

即使在使用IOC時也要使用接口.... – CSharpAtl 2009-12-17 20:03:09

回答

4

接口它。無論你需要存儲文件,只需要一個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 
    } 
} 
4

使用接口。

interface IStorage 
{ 
    void Save(string filename); 
} 

然後創建您的各種實現方式:

class LocalStorage : IStorage 
{ 
    void Save(string filename) 
    { 
     -implementation code- 
    } 
} 

,然後在你的消費類

​​
+1

+1。 LocalStorage類可能有一個字符串rootDirectory構造函數參數,而DatabaseStorage類可能需要一個存儲庫(或其他數據訪問類)等。 – 2009-12-17 20:03:46

2

我想補充一點已張貼別人,如果你想真的只是做一個改變,考慮一個靜態工廠:

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)); 

如果需要,輕鬆將其交換出來。

+0

+1可以使用配置文件獲取所需的配置文件,並且將來可以使用國際奧委會。 – CSharpAtl 2009-12-17 20:56:18