如何在 MVVM Light SimpleIoc 中注册一系列依赖项
How to register a range of dependencies in MVVM Light SimpleIoc
我想在我的视图模型定位器中注册和取消注册我的视图模型class。
我想收集所有视图模型并迭代它们以注册和注销它们。处理注册的方法声明如下:
public bool IsRegistered<T>();
public void Register<TClass>() where TClass : class;
public void Unregister<TClass>() where TClass : class;
我有很多套可以注册:
if (SimpleIoc.Default.IsRegistered<SettingsViewModel>() == false)
{
SimpleIoc.Default.Register<SettingsViewModel>();
}
并注销它们:
SimpleIoc.Default.Unregister<SettingsViewModel>();
我想 foreach 这段代码,这样我只有一个地方可以声明我的 ViewModel。我无法获得正确的语法来执行此操作。
//Incorrect non compiling code
foreach (Type viewModel in ViewModels)
{
T t = viewModel.BaseType;
if (SimpleIoc.Default.IsRegistered<viewModel>() == false)
{
SimpleIoc.Default.Register<viewModel>();
}
}
查看 SimpleIoc,我得出结论,没有办法做您想做的事,因为没有将 Type 作为参数的 Register 方法。
如果您考虑另一个 IoC 容器,下面是它如何与 autofac 一起工作。请注意,此示例做出了一些假设(对名称空间进行过滤并且每个依赖项都有一个接口),请在使用前根据您的情况删除或更改这些假设。
var repositoryAssembly = typeof(SettingsViewModel).Assembly;
var registrations =
from type in repositoryAssembly.GetExportedTypes()
where type.Namespace == "MyApp.ViewModels"
where type.GetInterfaces().Any()
select new { Service = type.GetInterfaces().Single(), Implementation = type };
foreach (var reg in registrations)
{
container.RegisterType(reg.Implementation).As(reg.Service).InstancePerRequest();
}
我想在我的视图模型定位器中注册和取消注册我的视图模型class。
我想收集所有视图模型并迭代它们以注册和注销它们。处理注册的方法声明如下:
public bool IsRegistered<T>();
public void Register<TClass>() where TClass : class;
public void Unregister<TClass>() where TClass : class;
我有很多套可以注册:
if (SimpleIoc.Default.IsRegistered<SettingsViewModel>() == false)
{
SimpleIoc.Default.Register<SettingsViewModel>();
}
并注销它们:
SimpleIoc.Default.Unregister<SettingsViewModel>();
我想 foreach 这段代码,这样我只有一个地方可以声明我的 ViewModel。我无法获得正确的语法来执行此操作。
//Incorrect non compiling code
foreach (Type viewModel in ViewModels)
{
T t = viewModel.BaseType;
if (SimpleIoc.Default.IsRegistered<viewModel>() == false)
{
SimpleIoc.Default.Register<viewModel>();
}
}
查看 SimpleIoc,我得出结论,没有办法做您想做的事,因为没有将 Type 作为参数的 Register 方法。
如果您考虑另一个 IoC 容器,下面是它如何与 autofac 一起工作。请注意,此示例做出了一些假设(对名称空间进行过滤并且每个依赖项都有一个接口),请在使用前根据您的情况删除或更改这些假设。
var repositoryAssembly = typeof(SettingsViewModel).Assembly;
var registrations =
from type in repositoryAssembly.GetExportedTypes()
where type.Namespace == "MyApp.ViewModels"
where type.GetInterfaces().Any()
select new { Service = type.GetInterfaces().Single(), Implementation = type };
foreach (var reg in registrations)
{
container.RegisterType(reg.Implementation).As(reg.Service).InstancePerRequest();
}