【问题标题】:MvvmLight SimpleIoc and multiple concrete implementationsMvvmLight SimpleIoc 和多个具体实现
【发布时间】:2013-10-10 17:00:58
【问题描述】:

对于SimpleIoc,我想注册IProvider 的多个实现,例如:

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

所以我可以这样做:

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

有没有办法做这样的事情?如果我按原样尝试,我会发现已经有一个为IProvider 注册的类。

【问题讨论】:

    标签: c# mvvm-light ioc-container


    【解决方案1】:

    您可以通过实现一个基类并使用键控注册来做到这一点:

    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);
    }
    

    【讨论】:

    • 啊,我很接近了。我注册了IProvider1IProvider2,每个都继承自IProvider。然后我注册了IEnumerable&lt;IProvider&gt;,工厂退回了集合。我更喜欢你的方式。谢谢!
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多