如何从类型注册到<t> </t>

时间:2014-08-21 09:13:16

标签: c# inversion-of-control mvvm-light windows-phone-8.1

我使用MVVM light包及其SimpleIoc开发适用于Windows 8.1和Windows Phone 8.1的通用应用程序。

目前,我有这种注册:

SimpleIoc.Default.Register<ISettings, LocalSettings>();
SimpleIoc.Default.Register<INavigationService, NavigationService>();

非常好,但我需要通过配置文件(XML)注册我的服务。 因此,我发现自己有以下几点:

Type interfaceType = Type.GetType(service.Interface);
Type implementationType = Type.GetType(service.Implementation);

&#34;服务&#34;是一个包含2个字符串的变量(接口/实现),指定ISettings等的类型和程序集。

如何将这两种类型注册到SimpleIoc容器?

我无法执行以下操作:

SimpleIoc.Default.Register(interfaceType, implementationType);

我必须使用另一个容器吗?是否存在一些扩展?

谢谢!

1 个答案:

答案 0 :(得分:4)

由于SimpleIoc类型没有提供执行此操作的非泛型方法,因此您必须在运行时制作自己的通用方法:

// Get the Register<T1,T2>() method
MethodInfo methodInfo =
    SimpleIoc.Default.GetType().GetMethods()
             .Where(m => m.Name == "Register")
             .Where(m => m.IsGenericMethod)
             .Where(m => m.GetGenericArguments().Length == 2)
             .Where(m => m.GetParameters().Length == 0)
             .Single();

// Create the generic type parameters to the method
Type interfaceType = Type.GetType(service.Interface);
Type implementationType = Type.GetType(service.Implementation);

// Create a version of the method that takes your types
methodInfo = methodInfo.MakeGenericMethod(interfaceType, implementationType);

// Invoke the method on the default container (no parameters)
methodInfo.Invoke(SimpleIoc.Default, null);

如果将来SimpleIoc界面发生变化,那么非常丑陋且有些脆弱,但它可以完成工作。