簡體   English   中英

使用構造函數依賴注入的簡單工廠來檢索文件

[英]Simple factory to retrieve files using constructor dependency injection

我想創建一個靈活的類,以便我可以切換實現。

問題:存儲文件/文檔
選項:本地存儲在服務器文件系統,數據庫等上。

有人可以提供有關該類骨架結構的幫助嗎,我怎么稱呼它?

我沒有使用IoC,並且還真的不想。 我只想在工廠中更改1個代碼以調用另一個實現的靈活性。

接口。 無論您需要存儲文件的地方,只要允許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-
    }
}

然后,在您的消費者類別中

IStorage storage = new LocalStorage();

// uses local storage
storage.Save();

storage = new DatabaseStorage();

// now use database storage
storage.Save();

僅添加一些其他人發布的內容,如果您真的想做一個更改,請考慮一個靜態工廠:

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

並在需要時輕松換出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM