我想在我的一个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?
答案 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();
}
}