我试图找出温莎作为IOC容器.我现在面临的问题是立即注册我的所有视图模型.
我已经看了一下这些文档,并认为以下代码应该可行.但是,当我之后检查容器时,没有注册.
container.Register(Classes.FromThisAssembly() .BasedOn() .LifestyleTransient());
ViewModelBase
我的基类在哪里.
还尝试了以下内容:
container.Register(Classes.FromThisAssembly() .InSameNamespaceAs() .LifestyleTransient());
可以解决必要的依赖关系,而不是视图模型.我想我在这里遗漏了一些明显的东西?
编辑
我的依赖项注册如下:
this.container.Register(Component.For().ImplementedBy ()); this.container.Register(Component.For ().ImplementedBy ());
UPDATE
由于这些建议不起作用,我计划在这里添加来自我的基类和viewmodel的代码.在这样做时,我注意到我的viewmodel-class是internal sealed
.将其更改为时public sealed
,上述代码确实有效.
有人可以解释为什么内部类不能在容器中注册吗?我已经用完全相同的设置测试了其他IOC容器,他们没有抱怨它.
当我添加组件服务选择时,您的注册示例在我的应用程序中开始运行良好.例如.WithService.AllInterfaces()
container.Register(Classes.FromThisAssembly() .BasedOn(typeof(MyBaseClass<>)) .WithService.AllInterfaces() .LifestylePerWebRequest() ); container.Register(Classes.FromThisAssembly() .InSameNamespaceAs<MyBaseClass>() .WithService.AllInterfaces() .LifestylePerWebRequest() );
更新:
为了注册内部类型,.IncludeNonPublicTypes()
应该使用.
public class ExampleTest { [Test] public void MyBaseClass_Base() { var target = new WindsorContainer(); target.Register(Classes.FromThisAssembly() .IncludeNonPublicTypes() .BasedOn(typeof(MyBaseClass<>)) .WithService.Base() //.LifestylePerWebRequest() ); //assert target.Resolve<MyBaseClass<int>>().Should().BeOfType<A>(); target.Resolve<MyBaseClass<string>>().Should().BeOfType<B>(); } [Test] public void MyBaseClass_Self() { var target = new WindsorContainer(); target.Register(Classes.FromThisAssembly() .IncludeNonPublicTypes() .BasedOn(typeof(MyBaseClass<>)) .WithService.Self() //.LifestylePerWebRequest() ); //assert target.Resolve<MyBaseClass<int>>().Should().BeOfType<MyBaseClass<int>>(); target.Resolve<MyBaseClass<string>>().Should().BeOfType<MyBaseClass<string>>(); target.Resolve<A>().Should().BeOfType<A>(); target.Resolve<B>().Should().BeOfType<B>(); } } internal class MyBaseClass<T> { } internal class A : MyBaseClass<int> { } internal class B : MyBaseClass<string> { }