Простая фабрика для извлечения файлов с использованием инжектора зависимости конструктора - PullRequest
1 голос
/ 17 декабря 2009

Я хочу создать класс, который будет гибким, чтобы я мог переключать реализации.

Проблема: Хранить файлы / документы
Опции: либо хранить локально в файловой системе сервера, базе данных и т. Д.

Может ли кто-нибудь помочь с каркасной структурой класса, и как бы я это назвал?

Я не использую IoC, и пока не хочу. Мне просто нужна гибкость, когда я могу сделать, возможно, 1 изменение кода на фабрике, чтобы вызвать другую реализацию.

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009

Использовать интерфейс.

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();
4 голосов
/ 17 декабря 2009

интерфейс это. Везде, где вам нужно хранить файлы, просто разрешите 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
   }
}
2 голосов
/ 17 декабря 2009

Просто добавьте немного того, что опубликовали другие, если вы действительно хотите просто внести одно изменение, рассмотрите статическую фабрику:

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

и при необходимости легко меняйте его.

...