C# Autofac注册表SemblyTypes多次
我有一个WPF应用程序,它具有多个视图模型和相应的类层次结构。现在我使用Autofac作为IoC框架。我的结构简化如下:C# Autofac注册表SemblyTypes多次,c#,dependency-injection,inversion-of-control,autofac,C#,Dependency Injection,Inversion Of Control,Autofac,我有一个WPF应用程序,它具有多个视图模型和相应的类层次结构。现在我使用Autofac作为IoC框架。我的结构简化如下: public class ViewModelBase {} public class ToolItemViewModel : ViewModelBase {} public class DocumentItemViewModel : ViewModelBase {} // Concrete implementations public class MainViewM
public class ViewModelBase
{}
public class ToolItemViewModel : ViewModelBase
{}
public class DocumentItemViewModel : ViewModelBase
{}
// Concrete implementations
public class MainViewModel : ViewModelBase
{}
public class EditorProperties : ToolItemViewModel
{}
public class TextViewModel : DocumentItemViewModel
{}
// Now in order to do something like this:
var mainViewModel = _scope.Resolve<MainViewModel>();
var tools = _scope.Resolve<IEnumerable<ToolItemViewModel>>();
var documents = _scope.Resolve<IEnumerable<DocumentItemViewModel>>();
// It seems I have to do the following registrations
builder.RegisterAssemblyTypes(typeof(App).Assembly).
Where(t => t.IsAssignableTo<ViewModelBase>()).AsSelf();
builder.RegisterAssemblyTypes(typeof(App).Assembly).
Where(t => t.IsSubclassOf(typeof(ToolItemViewModel))).As<ToolItemViewModel>();
builder.RegisterAssemblyTypes(typeof(App).Assembly).
Where(t => t.IsAssignableTo<DocumentItemViewModel>()).AsSelf().
Where(t => t.IsSubclassOf(typeof(DocumentItemViewModel))).As<DocumentItemViewModel>();
公共类ViewModelBase
{}
公共类工具ItemViewModel:ViewModelBase
{}
公共类DocumentItemViewModel:ViewModelBase
{}
//具体实施
公共类MainViewModel:ViewModelBase
{}
公共类编辑器属性:ToolItemViewModel
{}
公共类TextViewModel:DocumentItemViewModel
{}
//现在,为了做类似的事情:
var mainViewModel=_scope.Resolve();
var tools=_scope.Resolve();
var documents=_scope.Resolve();
//看来我得做以下登记了
RegisterAssemblyTypes(typeof(App.Assembly)。
其中(t=>t.IsAssignableTo()).AsSelf();
RegisterAssemblyTypes(typeof(App.Assembly)。
其中(t=>t.IsSubclassOf(typeof(ToolItemViewModel))).As();
RegisterAssemblyTypes(typeof(App.Assembly)。
其中(t=>t.IsAssignableTo()).AsSelf()。
其中(t=>t.IsSubclassOf(typeof(DocumentItemViewModel))).As();
我可以避免在这里多次运行“RegisterAssemblyTypes”吗?所有的类都是从ViewModelBase派生的,所以我认为一个“RegisterAssemblyTypes”就足够了。Autofac需要对每种类型进行多次调用(我也发布了链接): 扫描类型 也称为约定驱动的注册或扫描,Autofac可以根据用户指定的规则从程序集注册一组类型:
var dataAccess = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(dataAccess)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
每个RegisterAssemblyTypes()调用将仅应用一组规则-如果要注册多组不同的组件,则需要多次调用RegisterAssemblyTypes()