如何从类型注册到

本文关键字:注册 类型 | 更新日期: 2023-09-27 18:19:06

我正在为Windows 8.1和Windows Phone 8.1开发一个通用应用程序,使用MVVM轻包及其SimpleIoc。

目前,我有这样的注册:

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

这很好,但我需要通过配置文件(XML)注册我的服务。因此,我发现自己有以下内容:

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

"service"是一个包含2个字符串(接口/实现)的变量,指定set的类型和集合等。

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

我不能做以下事情:

SimpleIoc.Default.Register(interfaceType, implementationType);

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

谢谢!

如何从类型注册到<T>

由于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接口发生了变化,它会变得非常丑陋并且有些脆弱,但是它可以完成工作。