【问题标题】: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();