我使用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);
我必须使用另一个容器吗?是否存在一些扩展?
谢谢!
答案 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
界面发生变化,那么非常丑陋且有些脆弱,但它可以完成工作。