MvvmCross:IoC with Decorator模式,两个相同接口的实现

时间:2014-02-25 15:57:08

标签: inversion-of-control decorator ioc-container mvvmcross

我想在我的一个Mvx项目中实现Decorator模式。也就是说,我希望有两个相同接口的实现:一个可用于所有调用代码的实现,另一个实现注入第一个实现。

public interface IExample
{
    void DoStuff();
}

public class DecoratorImplementation : IExample
{
    private IExample _innerExample;
    public Implementation1(IExample innerExample)
    {
        _innerExample = innerExample;
    }

    public void DoStuff()
    {
        // Do other stuff...
        _innerExample.DoStuff();
    }
}

public class RegularImplementation : IExample
{
    public void DoStuff()
    {
        // Do some stuff...
    }
}

是否可以连接MvvmCross IoC容器以使用包含RegularImplementation的DecoratorImplementation注册IExample?

1 个答案:

答案 0 :(得分:1)

取决于。

如果DecoratorImplementation是单身人士,那么您可以执行以下操作:

Mvx.RegisterSingleton<IExample>(new DecoratorImplementation(new RegularImplementation()));

然后调用Mvx.Resolve<IExample>()将返回DecoratorImplementation

的实例

但是,如果您需要一个新实例,不幸的是MvvmCross IoC Container不支持。如果你可以这样做会很好:

Mvx.RegisterType<IExample>(() => new DecoratorImplementation(new RegularImplementation()));

您传入lambda表达式以创建新实例的位置,类似于StructureMap的ConstructedBy

无论如何,您可能需要创建一个Factory类来返回实例。

public interface IExampleFactory 
{
    IExample CreateExample();
}

public class ExampleFactory : IExampleFactory 
{
    public IExample CreateExample() 
    {
        return new DecoratorImplementation(new RegularImplementation());
    }
}

Mvx.RegisterSingleton<IExampleFactory>(new ExampleFactory());

public class SomeClass 
{
    private IExample _example;
    public SomeClass(IExampleFactory factory) 
    {
         _example = factory.CreateExample();
    }
}