Spring .Net配置流畅

时间:2010-12-29 23:03:00

标签: dependency-injection ioc-container spring.net

我需要在项目中使用Spring .Net并且正在探索配置选项。我能找到关于Spring .Net配置的所有内容都是配置文件。 Spring是否支持代码配置?我使用过Castle和Ninject,两者似乎都是本土的。我发现了声称会增加支持的项目,但我不想要一些会在6个月内死掉的项目。我发现博客中的引用似乎表明Spring支持这一点,但我找不到任何文档!!

第2部分可能会推荐Spring .Net而不是Windsor知道它不支持流畅的配置吗?我知道两者都是很棒的IoC容器,但是我已经处理过具有Spring配置的大量配置文件的项目,我讨厌它。

6 个答案:

答案 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月)发布时公布(但不包括在内)。

来自MovieFinder example

[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");
    }