structuremap과 내가 설정 해야하는 공공 재산 문제
-
21-08-2019 - |
문제
내가 사용한 인터페이스가 있습니다 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" });
나는 그것을 할 수있는 다른 많은 방법이 있다고 확신합니다.
다른 팁
이 구현에 의해서만 필요하다면 이것을 생성자에 넣는 것은 어떻습니까?