Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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+;ReactiveUI视图用于<;IViewModelType>;登记处_C#_Autofac_Reactiveui - Fatal编程技术网

C# AutoFac+;ReactiveUI视图用于<;IViewModelType>;登记处

C# AutoFac+;ReactiveUI视图用于<;IViewModelType>;登记处,c#,autofac,reactiveui,C#,Autofac,Reactiveui,我是AutoFac(和ReactiveUI!)的新手,在向容器注册视图时遇到问题 该视图具有以下特征: public partial class DataSelectView : IViewFor<IDataSelectViewModel> public分部类DataSelectView:IViewFor 我已经在集装箱上注册了以下内容: builder.RegisterType<DataSelectView>().As<IViewFor<IDataSel

我是AutoFac(和ReactiveUI!)的新手,在向容器注册视图时遇到问题

该视图具有以下特征:

public partial class DataSelectView : IViewFor<IDataSelectViewModel>
public分部类DataSelectView:IViewFor
我已经在集装箱上注册了以下内容:

builder.RegisterType<DataSelectView>().As<IViewFor<IDataSelectViewModel>>();
builder.RegisterType<DataSelectViewModel>().As<IDataSelectViewModel>();
builder.RegisterType().As();
builder.RegisterType().As();
当我运行程序时,我发现AutoFac正在尝试解析
IViewFor
而不是
IViewFor
,因此抛出一个错误,表示它找不到
IViewFor。

我不想将视图声明更改为
:IViewFor
,因为我想保持灵活性,以便在将来必要时将
IDataSelectViewModel
的注册更改为其他默认实现


我觉得我在这里犯了一个简单的错误,但却不知道如何解决它!非常感谢您的帮助。

最简单的解决方案是更改您的
DataSelectView
以允许通用:

public class DataSelectView<TViewModel> : IViewFor<TViewModel>
    where TViewModel : IViewModel 
然后,Autofac将能够解析
IViewFor


另一种可能的解决方案是,在泛型声明中使用in关键字,使接口的iviewf逆变。然后,Autofac将能够解析
IViewFor

您可以在此处找到更多信息:

如果您确实想自定义视图位置的工作方式,可以完全覆盖它:

ViewLocator.Current = new MyCoolViewLocator();

如果您不想更改声明,为什么不更改注册。而不是builder.RegisterType().As();使用builder.RegisterType().As();谢谢你的回复。我最初尝试过,但我得到另一个错误,即
DataSelectView
不可分配给
IViewFor
。ReactiveUI默认使用的Splat服务定位器似乎对这种注册很满意,但AutoFac不会接受它。@Nihilus除非您将接口转换为逆变接口(请参阅我答案中的更新),谢谢您的回复。我可以看出您的方法是可行的,但问题是DataSelectView是一个WPF用户控件,具有单独的XAML定义(在上面的代码片段中声明为
partial
)。我已经看到创建通用WPF控件是可能的,但这似乎是一个很长的解决方法。
// Add the in modifier
public interface IViewFor<in TViewModel>
    where TViewModel : IDataSelectViewModel
{ }

// register it this way
builder.RegisterType<DataSelectView>().As<IViewFor<DataSelectViewModel>>();

// resolve works with 
container.Resolve<IViewFor<DataSelectViewModel>>();
public interface IViewFor<in TViewModel>
    where TViewModel : IDataSelectViewModel
{ 

    void Do(TViewModel vm); // allowed
    TViewModel Do(); // disallowed
}
ViewLocator.Current = new MyCoolViewLocator();