我需要在项目中使用Spring .Net并且正在探索配置选项。我能找到关于Spring .Net配置的所有内容都是配置文件。 Spring是否支持代码配置?我使用过Castle和Ninject,两者似乎都是本土的。我发现了声称会增加支持的项目,但我不想要一些会在6个月内死掉的项目。我发现博客中的引用似乎表明Spring支持这一点,但我找不到任何文档!!
第2部分可能会推荐Spring .Net而不是Windsor知道它不支持流畅的配置吗?我知道两者都是很棒的IoC容器,但是我已经处理过具有Spring配置的大量配置文件的项目,我讨厌它。
答案 0 :(得分:11)
不,Spring.NET 的当前版本(1.3)仅支持XML 配置。在未来的版本中一直有关于支持Code as Configuration的讨论,但这还没有实现。
在我看来, Castle Windsor远远优于Spring.NET。我无法想象Castle Windsor没有的Spring.NET的一个特性。另一方面,Castle Windsor具有Spring.NET中没有的以下功能:
我可能忘记了其他功能......
看起来我在触发器上的速度有点太快了,虽然为了我的辩护,Spring.NET文档还指出当前版本中只有XML配置。
然而,事实证明,如果对于某些上下文,可以使用非常原始的API来配置不带XML的上下文。这是一个例子:
var context = new GenericApplicationContext();
context.RegisterObjectDefinition("EggYolk",
new RootObjectDefinition(typeof(EggYolk)));
context.RegisterObjectDefinition("OliveOil",
new RootObjectDefinition(typeof(OliveOil)));
context.RegisterObjectDefinition("Mayonnaise",
new RootObjectDefinition(typeof(Mayonnaise),
AutoWiringMode.AutoDetect));
请注意此API如何非常接近XML配置架构。因此,您无法从IObjectDefinitionRegistry
界面获得任何流畅的API,但至少有一个与XML分离的API。在此基础上构建流畅的API至少在理论上是可行的。
答案 1 :(得分:5)
您将在github上找到适用于spring.net的完全可用的Spring流畅API:
https://github.com/thenapoleon/Fluent-API-for-Spring.Net
此API提供流畅的配置,并将很快支持基于约定的配置。
答案 2 :(得分:3)
回答问题的第一部分:Springsource团队似乎正在开发github上的代码配置项目:https://github.com/SpringSource/spring-net-codeconfig。它是在1.3.1(2010年12月)发布时公布(但不包括在内)。
[Configuration]
public class MovieFinderConfiguration
{
[Definition]
public virtual MovieLister MyMovieLister()
{
MovieLister movieLister = new MovieLister();
movieLister.MovieFinder = FileBasedMovieFinder();
return movieLister;
}
[Definition]
public virtual IMovieFinder FileBasedMovieFinder()
{
return new ColonDelimitedMovieFinder(new FileInfo("movies.txt"));
}
}
答案 3 :(得分:3)
使用Spring.AutoRegistration还有另一种选择。与Unity AutoRegistration一样使用的概念。
https://www.nuget.org/packages/Spring.AutoRegistration
http://autoregistration.codeplex.com/
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();
答案 4 :(得分:2)
也可以使用Spring.FluentContext项目。
有了它,MovieFinder的配置如下:
// Configuration
private static IApplicationContext Configure()
{
var context = new FluentApplicationContext();
context.RegisterDefault<MovieLister>()
.BindProperty(l => l.MovieFinder).ToRegisteredDefaultOf<ColonDelimitedMovieFinder>();
context.RegisterDefault<ColonDelimitedMovieFinder>()
.UseConstructor((FileInfo fileInfo) => new ColonDelimitedMovieFinder(fileInfo))
.BindConstructorArg().ToValue(new FileInfo("movies.txt"));
return context;
}
// Usage
static void Main(string[] args)
{
IApplicationContext context = Configure();
var movieLister = context.GetObject<MovieLister>();
foreach (var movie in movieLister.MoviesDirectedBy("Roberto Benigni"))
Console.WriteLine(movie.Title);
Console.ReadLine();
}
对象不需要任何硬编码的文字ID(但允许),它是类型安全的,包含GitHub wiki上的样本文档。
答案 5 :(得分:0)
使用Fluent-API-for-Spring.Net,配置可能如下所示:
private void ConfigureMovieFinder()
{
FluentApplicationContext.Clear();
FluentApplicationContext.Register<ColonDelimitedMovieFinder>("ColonDelimitedMovieFinder")
.BindConstructorArgument<FileInfo>().To(new FileInfo("movies.txt"));
// By default, fluent spring will create an identifier (Type.FullName) when using Register<T>()
FluentApplicationContext.Register<MovieLister>()
.Bind(x => x.MovieFinder).To<IMovieFinder>("ColonDelimitedMovieFinder");
}