Проблема с StructureMap и публичным свойством, которое мне нужно установить - PullRequest
1 голос
/ 16 декабря 2008

У меня есть интерфейс, который я использовал StructureMap до Dependency Inject .

public interface IFileStorageService
{
    void SaveFile(string fileName, byte[] data);
}

Интерфейсу все равно, ГДЕ сохраняются данные. Будь то память, файл, сетевой ресурс, спутник в космосе ...

Итак, у меня есть два класса, которые реализуют этот интерфейс; test class и network file storage class: -

public class TestFileStorageService : IFileStorageService
{ ... etc ...}

public class NetworkFileStorageService : IFileStorageService
{
    public string NetworkUnc { get; set; }
    public void SaveFile(...);
}

Обратите внимание, как у моего NetworkFileStorageService есть свойство? Этот класс требует этого значения в своей реализации метода SaveFile.

Ну, я не уверен, как определить это свойство.

Я думал, что смогу жестко запрограммировать его там, где я определю свою зависимость (например, в моем методе начальной загрузки -> ForRequestedType<IFileStorageService> ... и т. Д.), Но кикером является ... бизнес-логика DEFINES местоположение , Это не статично.

Наконец, поскольку я использую интерфейсы в своей логике, это свойство недоступно.

Может кто-нибудь помочь?

Если вы можете, изображение, которое вы хотите сохранить два файла

  • Имя: Test1.bin; расположение: \ server1 \ folder1
  • Имя: Test2.bin; расположение: \ server1 \ folder2

ура!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2009

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

Есть несколько способов решить эту проблему с помощью Structuremap. Вы можете создать фабричный метод, подобный этому

x.ForRequestedType<Func<string, IFileStorageService>>()
  .TheDefault.Is.ConstructedBy(
    () =>
    NetworkUnc  =>
    {
      var args = new StructureMap.Pipeline.ExplicitArguments();
      args.SetArg("NetworkUnc", NetworkUnc );
      return StructureMap.ObjectFactory.GetInstance<IFileStorageService>(args);
    });

теперь вы можете создать свой объект с помощью

StructureMap.ObjectFactory
  .GetInstance<Func<string, IFileStorageService>>()("something");

Но это не так красиво. Или создайте класс конфигурации для этого класса.

public class NetworkFileStorageServiceConfig
{
    public string NetworkUnc { get; set; }
}

и настройте его

x.ForRequestedType<NetworkFileStorageServiceConfig>().TheDefault.Is.IsThis(
  new NetworkFileStorageServiceConfig { NetworkUnc  = "something" });

Я уверен, что есть и много других способов сделать это.

0 голосов
/ 16 декабря 2008

, если это требуется только этой реализацией, как насчет того, чтобы поместить это в ваш конструктор?

...