C# AutoFac+;ReactiveUI视图用于<;IViewModelType>;登记处
我是AutoFac(和ReactiveUI!)的新手,在向容器注册视图时遇到问题 该视图具有以下特征: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
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();