문제

내가 사용한 인터페이스가 있습니다 StructureMap 에게 종속성 주입.

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

인터페이스는 데이터가 저장되는 위치에 신경 쓰지 않습니다. 메모리, 파일, 네트워크 리소스, 우주 위성에 대한 것입니다 ....

따라서이 인터페이스를 구현하는 두 가지 클래스가 있습니다. ㅏ test class 그리고 a 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>... 등)하지만 키커는 .. 비즈니스 로직 정의합니다 위치. 정적이 아닙니다.

마지막으로, 내 논리에서 인터페이스를 사용하기 때문에이 속성을 사용할 수 없습니다.

누구든지 도울 수 있습니까?

가능하다면 이미지 두 파일을 저장하려고합니다.

  • 이름 : test1.bin; 위치 : server1 folder1
  • 이름 : test2.bin; 위치 : server1 folder2

건배!

도움이 되었습니까?

해결책

구조 맵은 모든 생성자 인수가 필요하다고 가정하고 속성이 선택 사항이라고 가정합니다.

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

나는 그것을 할 수있는 다른 많은 방법이 있다고 확신합니다.

다른 팁

이 구현에 의해서만 필요하다면 이것을 생성자에 넣는 것은 어떻습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top