使用相同的接口调用多个类

fri*_*edX 5 c# structuremap unit-testing dependency-injection

我有一个像这样的界面

public interface IAddressProvider
{
    string GetAddress(double lat, double long);
}
Run Code Online (Sandbox Code Playgroud)

在我的消费类中,我想循环遍历具体的提供者,直到得到结果,例如(简化的):

string address;
address = _cachedAddressProvider.GetAddress(lat, long);
if(address == null)
    address = _localDbAddressProvider.GetAddress(lat, long);
if(address = null)
    address = _externalAddressProvider.GetAddress(lat, long);

return address ?? "no address found";
Run Code Online (Sandbox Code Playgroud)

然后,我可以模拟每个提供程序进行单元测试,将 null 设置为返回值以适当测试所有代码路径。

我如何将接口注入到我的消费类中(最好使用 StructureMap)以便正确解析每个具体实现?

Maa*_*ten 4

事实上,您有多个地址提供者并不是调用代码应该处理的事情。因此,创建一个特定的提供者代理来处理这些多个提供者。

像这样。

public interface IAddressProvider {
    string GetAddress(double lat, double long);
}

public class AddressProviderProxy: IAddressProvider {
    public AddressProviderProxy(IAddressProvider[] providers) {
        _providers = providers; // TODO: Add a NULL guard
    }

    private readonly IAddressProvider[] _providers;

    string IAddressProvider.GetAddress(double lat, double long) {
        foreach (var provider in _providers) {
            string address = provider.GetAddress(lat, long);
            if (address != null)
                return address;
        }
        return null;
    }
}

// Wire up using DI
container.Register<IAddressProvider>(
    () => new AddressProviderProxy(
        new IAddressProvider[3] {
            cachedAddressProvider,
            localDbAddressProvider,
            externalAddressProvider
        }
    )
);

// Use it
IAddressProvider provider = ...from the container, injected..
string address = provider.GetAddress(lat, long) ?? "no address found";
Run Code Online (Sandbox Code Playgroud)