Переданный аргумент не является предпочтительным по сравнению с реализацией по умолчанию в замке Виндзор.

Я хотел бы предпочесть реализацию параметра реализации, зарегистрированной по умолчанию, но это не работает.

Демонстрация неправильного предпочтения

    private static void Main(string[] args)
    {
        PassParamThatsAlreadyRegisteredAtResolutionTime();
        Console.ReadLine();
    }

    private static void PassParamThatsAlreadyRegisteredAtResolutionTime()
    {
        Console.WriteLine("Passing argument that is already registered 
                    does not take precedence over the default implementation");
        var container = new WindsorContainer();
        container.Register(
            Component.For<ISimpletonManager>()
                     .ImplementedBy<SimpletonManager>()
                     .LifestyleTransient()
                     .Properties(PropertyFilter.IgnoreAll));
        container.Register(Component.For<ISimpleton>().UsingFactoryMethod(() =>
                                     new Simpleton("Default Implementation"))
                                    .LifestyleTransient());
        // The above line could equally be the following, result is the same:
        // container.Register(Component.For<ISimpleton>()
        //                     .ImplementedBy<Simpleton>().LifestyleTransient());
        var runtimeConstructorParam = new Simpleton("Passed In Implementation");
        var runtimeArguments = new Arguments(
                                 new object[] {runtimeConstructorParam});
        var shouldBeManagerWithPassedInSimpleton = container
                             .Resolve<ISimpletonManager>(runtimeArguments);
        Console.WriteLine(shouldBeManagerWithPassedInSimpleton.Log);
    }

Консольный вывод

Passing argument that is already registered
does not take precedence over the default implementation
Birth With Child Simpleton: Default Implementation

Как инвертировать предпочтения?

  • Мне нужно иметь возможность игнорировать зарегистрированную зависимость по умолчанию и вместо этого решить Castle Windsor, используя предоставленный аргумент в качестве зависимости ISimpleton?
  • Нужно ли мне реализовывать собственный IDependencyResolver? Как?
  • Или здесь могут быть полезны Динамические параметры?

Предоставленная зависимость — класс Simpleton

public class Simpleton : ISimpleton
{
    public Simpleton(string id)
    {
        Id = id;
    }

    public string Id { get; set; }
}

Разрешенный тип — SimpletonManager

public class SimpletonManager : ISimpletonManager
{
    private ISimpleton _child;

    public SimpletonManager(ISimpleton simpleton)
    {
        Child = simpleton;
    }

    public ISimpleton Child
    {
        get { return _child; }
        set
        {
            _child = value;
            Log = "Birth With Child Simpleton: " + Child.Id;
        }
    }

    public string Log { get; private set; }
}

[ Использование Castle.Core.dll и Castle.Windsor.dll 3.1.0 (2012-08-05)< /а> ]


comment
вы передаете массив объектов, хотя кажется, что люди из Виндзора предлагают либо передать IDictionary, либо анонимный объект - хотя не уверен, что это имеет значение: docs.castleproject.org/Windsor.Passing-Arguments.ashx   -  person Joanna Derks    schedule 28.01.2013
comment
@JoannaTurban класс Arguments на самом деле является специальным словарем из библиотеки Windsor, и создание его с помощью массива объектов то, что вы найдете в документации - независимо от того, точно такой же код работает при использовании неуниверсального параметра.. спасибо за мысль.   -  person Cel    schedule 28.01.2013


Ответы (1)


Как и в случае с вашим другим вопросом, тип зависимости отличается от типа, который предоставляет Arguemnts

person Krzysztof Kozmic    schedule 28.01.2013
comment
Спасибо! Извините, я испортил пример кода раньше, я устал :) Я обновил код, чтобы проиллюстрировать проблему, и как я могу заставить Castle Windsor предпочесть зависимость, предоставленную во время разрешения, по сравнению с реализацией по умолчанию, предоставленной во время регистрации ? По сути, мне нужна реализация времени регистрации, когда во время разрешения не предоставляются аргументы (по умолчанию), на самом деле мне также нужна реализация времени регистрации для совершенно разных классов, но всякий раз, когда я предоставляю реализацию во время разрешения, мне нужно Виндзор использовать то, чего не происходит? - person Cel; 29.01.2013
comment
Викид! Решение пришло с var runtimeArguments = new Arguments{{ typeof(ISimpleton), runtimeConstructorParam }}; - person Cel; 03.02.2013