【问题标题】:Does Spring.Net have any convention based binding (like Ninject.Extensions.Conventions)Spring.Net 是否有任何基于约定的绑定(如 Ninject.Extensions.Conventions)
【发布时间】:2011-04-20 15:20:57
【问题描述】:

我熟悉 Ninject,但不熟悉 Spring.Net。我正在尝试确定 Spring.net 中是否存在等效于“Ninject.Extensions.Conventions”的内容。允许基于约定的映射的东西。 E.G - 可以让我定义如下规则的东西:

  • 期望给定命名空间或程序集中的所有具体类都具有同名但前缀为 I 的对应接口。自动将它们相互映射。

谢谢

【问题讨论】:

    标签: .net dependency-injection inversion-of-control spring.net


    【解决方案1】:

    不,Spring.NET 几乎没有将代码作为配置,因此根本不提供自动注册。

    【讨论】:

      【解决方案2】:

      Spring.net 使用不同的方法,他们有依赖于属性的 CodeConfig,基本上你在类中设置一些属性,以便 DI 容器知道需要注入哪些类。你可以找到更多信息here

      对我而言,配置 IOC 的最佳方式是使用 xml 文件,因为您无需编译任何内容即可控制应用的行为,即使在生产环境中也是如此。

      【讨论】:

        【解决方案3】:

        还有另一个使用 Spring.AutoRegistration 的选项。与 Unity AutoRegistration 使用相同的概念。

        http://rafaelnaskar.blogspot.com.br/2012/12/springautoregistration-fluent.html

        https://www.nuget.org/packages/Spring.AutoRegistration

            var context = new GenericApplicationContext();
            context.Configure()
                    .IncludeAssembly(x => x.FullName.StartsWith("Company.ApplicationXPTO"))
                    .Include(x => x.ImplementsITypeName(), Then.Register().UsingSingleton()
                          .InjectByProperty(If.DecoratedWith<InjectAttribute>))
                    .ApplyAutoRegistration();
        
               var context = new GenericApplicationContext();
               context.Configure()
                    .Include(If.DecoratedWith<NamedAttribute>,Then.Register().UsingSingleton().InjectByProperty(If.DecoratedWith<InjectAttribute>))
                    .Include(If.Implements<IController>, 
                        Then.Register().UsingPrototype().InjectByProperty(If.DecoratedWith<InjectAttribute>))
                    .ApplyAutoRegistration();
        
        
        
                var context = new GenericApplicationContext();
                context.Configure()
                    .IncludeAssembly(x => x.FullName.StartsWith("Spring.AutoRegistration.Test"))
                    .Include(x => x.GetInterfaces().Length > 0, 
                        Then.Register().WithNamedAttributeIfExists().UsingPrototype()
                            .InjectByProperty(If.DecoratedWith<InjectAttribute>))
                    .ApplyAutoRegistration();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 2011-05-14
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多