MvvmLight SimpleIoc and multiple concrete implementations

偶尔善良 提交于 2019-12-01 21:14:58

问题


With SimpleIoc I'd like to register multiple implementations of IProvider, something like:

SimpleIoc.Default.Register<IProvider, Provider1>();
SimpleIoc.Default.Register<IProvider, Provider2>();

So I can do:

var providers = SimpleIoc.GetAllInstances<IProvider>();

Is there a way to do something like this? If I try it as is I get that there is already a class registered for IProvider.


回答1:


You can do it by implementing a base class and using keyed registrations:

public interface IProvider { }
public abstract class BaseProvider : IProvider { }
public class Provider1 : BaseProvider { }
public class Provider2 : BaseProvider { }

[Test]
public void RegisterTwoImplementations_GetAllInstances_ReturnsBothInstances()
{
    SimpleIoc.Default.Register<Provider1>();
    SimpleIoc.Default.Register<Provider2>();

    SimpleIoc.Default.Register<BaseProvider>(() => 
            SimpleIoc.Default.GetInstance<Provider1>(), "a" );

    SimpleIoc.Default.Register<BaseProvider>(() =>
            SimpleIoc.Default.GetInstance<Provider2>(), "b");

    var result = SimpleIoc.Default.GetAllInstances<BaseProvider>();

    Assert.That(result, Is.Not.Null);
    Assert.That(result.Count(), Is.EqualTo(2));
    Assert.That(result.Any(x => x.GetType() == typeof(Provider1)), Is.True);
    Assert.That(result.Any(x => x.GetType() == typeof(Provider2)), Is.True);
}


来源:https://stackoverflow.com/questions/19301891/mvvmlight-simpleioc-and-multiple-concrete-implementations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!