我想知道如何在不同的客户端中使用一个接口的不同实现。这是示例情况。
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];
}
}
我想以这样的方式配置 IoC 容器,它将用于SimpleRandomIntGenerator
forRandomArrayItemChoose
和CryptoServiceProviderRandomIntGenerator
for LogInCodeGenerator
。
有没有办法用任何流行的 .NET IoC 容器来做到这一点?我对温莎城堡特别感兴趣。