Конфигурация Spring .Net свободно - PullRequest
3 голосов
/ 30 декабря 2010

Мне нужно использовать Spring .Net в проекте, и я изучаю параметры конфигурации. Все, что я могу найти о конфигурации для Spring .Net, это файлы конфигурации. Поддерживает ли Spring конфигурацию в коде? Я использовал Castle и Ninject, и оба, кажется, предлагают это изначально. Я нашел проекты, которые утверждают, что добавили поддержку, но я не хочу, чтобы какой-то проект был сорван, и он умрет через 6 месяцев. Я нашел ссылки в блогах, которые, кажется, указывают, что Spring поддерживает это, но я не могу найти какую-либо документацию !!

Возможно, во второй части этой статьи вы бы порекомендовали Spring .Net поверх Windsor, зная, что он не поддерживает плавную настройку? Я знаю, что оба являются отличными контейнерами IoC, но я работал над проектами, которые имеют массивные конфигурационные файлы для конфигурации Spring, и я ненавижу это.

Ответы [ 6 ]

11 голосов
/ 30 декабря 2010

Нет, текущая версия (1.3) Spring.NET поддерживает только конфигурацию XML .Говорили о поддержке кода как конфигурации в будущих версиях, но это еще не материализовано.

На мой взгляд, Castle Windsor намного превосходит по сравнению с Spring.NET.Я не могу вспомнить ни одной особенности Spring.NET, которой нет у Castle Windsor.С другой стороны, 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.Таким образом, вы не получаете никакого свободного API от интерфейса IObjectDefinitionRegistry, но по крайней мере есть API, который отделен от XML.Построение свободного API поверх этого по крайней мере теоретически возможно.

5 голосов
/ 20 февраля 2011

На github вы найдете полностью работающий API-интерфейс для работы с пружинами на spring.net:

https://github.com/thenapoleon/Fluent-API-for-Spring.Net

Этот API-интерфейс обеспечивает быструю настройку и скоро будет поддерживать конфигурацию на основе соглашений.

3 голосов
/ 06 декабря 2012

Существует еще один вариант использования Spring.AutoRegistration.Та же концепция, что и для Unreg 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();
3 голосов
/ 31 января 2011

В ответ на первую часть вашего вопроса: команда springsource работает над проектом конфигурации кода на github: https://github.com/SpringSource/spring-net-codeconfig. Было объявлено (но не включено) в 1.3.1 (декабрь) 2010) выпуск.

Из примера MovieFinder :

[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"));
    }
}
2 голосов
/ 28 июня 2013

Также возможно использование 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();
}

Он не требует каких-либо жестко закодированных литеральных идентификаторов для объектов (но позволяет это), он безопасен по типу и содержит документацию с образцами на GitHub wiki .

0 голосов
/ 11 марта 2011

Используя 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");
    }
...