基于基类注册类型

 吴雨醒 发布于 2023-02-13 11:31

我试图找出温莎作为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容器,他们没有抱怨它.

1 个回答
  • 当我添加组件服务选择时,您的注册示例在我的应用程序中开始运行良好.例如.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>
    {
    }
    

    2023-02-13 11:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有