Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac注册表SemblyTypes多次_C#_Dependency Injection_Inversion Of Control_Autofac - Fatal编程技术网

C# Autofac注册表SemblyTypes多次

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

我有一个WPF应用程序,它具有多个视图模型和相应的类层次结构。现在我使用Autofac作为IoC框架。我的结构简化如下:

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()