다른 클라이언트에서 하나의 인터페이스로 다른 구현을 사용하는 방법이 궁금합니다. 다음은 상황의 예입니다.IoC 컨테이너가있는 다른 장소에서 다른 구현을 사용하는 방법
public interface IRandomIntGenerator
{
int Generate();
}
public class SimpleRandomIntGenerator : IRandomIntGenerator
{
public int Generate()
{
return new Random().Next();
}
}
public class CryptoServiceProviderRandomIntGenerator : IRandomIntGenerator
{
public int Generate()
{
var generator = new RNGCryptoServiceProvider();
byte[] bytes = new byte[4];
generator.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
}
그런 다음 특정 구현에 대해 알고 싶지 않은 두 명의 고객이 있습니다. 하나는 로그인 코드를 생성하고 다른 하나는 배열의 임의 항목을 선택합니다.
public class LogInCodeGenerator
{
private readonly IRandomIntGenerator randomIntGenerator;
public LogInCodeGenerator(IRandomIntGenerator randomIntGenerator)
{
this.randomIntGenerator = randomIntGenerator;
}
public string GenerateCode(int length)
{
var builder = new StringBuilder(length);
for (int i = 0; i < length; i++)
builder.Append(randomIntGenerator.Generate() % 10);
return builder.ToString();
}
}
public class RandomArrayItemChoose
{
private readonly IRandomIntGenerator randomIntGenerator;
public RandomArrayItemChoose(IRandomIntGenerator randomIntGenerator)
{
this.randomIntGenerator = randomIntGenerator;
}
public string Choose(string[] arr)
{
return arr[randomIntGenerator.Generate() % arr.Length];
}
}
가 나는 LogInCodeGenerator
에 대한 RandomArrayItemChoose
에 대한 SimpleRandomIntGenerator
및 CryptoServiceProviderRandomIntGenerator
를 사용할 것이다 그런 방법으로 IoC 컨테이너를 구성 할.
.NET에서 널리 사용되는 IoC 컨테이너에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 윈저성에 특히 관심이 있습니다.
나는 IRandomIntGenertor''에서 상속 빈 인터페이스 결국했습니다. – Kirill
@Kirill : 한 줄의 코드를 저장합니다. 그만한 가치가 있니? – Steven
이것은 하나의 예일뿐입니다. 대부분의 경우 인터페이스에는 여러 가지 방법이 있습니다. 그러나, 나는 아직도 그것을 더러운 해킹처럼 느낀다. – Kirill