Замок Виндзор не может разрешить классы, которые реализуют ICommand WPF - PullRequest
1 голос
/ 09 декабря 2010

Я вижу странное поведение при попытке зарегистрировать WPF ICommands с помощью Castle Windsor.

При запуске включенного кода я получаю следующую ошибку:

Невозможно создатьКомпонент 'ConsoleApplication1.TestParent', поскольку он имеет зависимости, которые должны быть удовлетворены.
ConsoleApplication1.TestParent ожидает следующих зависимостей:
Ключи (компоненты с конкретными ключами)
testChild, который не был зарегистрирован.

Однако, если я изменяю интерфейс TestChild с ICommand на ITest, то код работает нормально.

Кто-нибудь еще был свидетелем такого поведения и / или знает, как его решить?

Я использую VS2008, .NET 3.5 и Castle 2.5.2.

Спасибо,
Стюарт

    using System; 
    using System.Windows.Input; 
     
    using Castle.MicroKernel.Registration; 
    using Castle.Windsor; 
 
    namespace ConsoleApplication1 
    { 
        class Program 
        { 
            static void Main(string[] args) 
            { 
                var container = new WindsorContainer(); 
                 
                container.Register( 
                    Component.For<TestParent>().ImplementedBy<TestParent>(), 
                    Component.For<TestChild>().ImplementedBy<TestChild>() 
                    ); 
 
                var parent = container.Resolve<TestParent>(); 
            } 
        } 
 
        public interface ITest {} 
 
        public class TestParent 
        { 
            public TestParent(TestChild testChild) { } 
        } 
 
        public class TestChild : ICommand 
        { 
            public event EventHandler CanExecuteChanged; 
            public bool CanExecute(object parameter) { return true; } 
            public void Execute(object parameter) {} 
        } 
    } 

Ответы [ 4 ]

1 голос
/ 09 декабря 2010

Игнорируя тот факт, что ваш пример кода не компилируется из-за неправильного вызова регистрации в Виндзоре, может быть, вы захотите что-то подобное?

class Program          
{              
    static void Main(string[] args)              
    {                  
        var container = new WindsorContainer();

        container.Register(
            Component.For<TestParent>(),
            Component.For<ICommand>().ImplementedBy<TestChild>()
        );

        var parent = container.Resolve<TestParent>();
    }
}

public class TestParent
{              
    public TestParent(ICommand testChild) { }
}  

public class TestChild : ICommand          
{              
    public event EventHandler CanExecuteChanged;              
    public bool CanExecute(object parameter) { return true; }              
    public void Execute(object parameter) {}          
} 

}

Обратите внимание, что я удалил определение интерфейса ITest, понятия не имею, для чего он использовался.

1 голос
/ 09 декабря 2010

Я вижу странное поведение при попытке зарегистрировать WPF ICommands с помощью Castle Windsor.

При запуске включенного кода я получаю следующую ошибку:

Невозможно создать компонент 'ConsoleApplication1.TestParent', так как он имеет зависимости, которые должны быть удовлетворены.
ConsoleApplication1.TestParent ожидает следующих зависимостей:

Ключи (компоненты с определенными ключами)
- testChild, который не был зарегистрирован.

Однако, если я изменю интерфейс на TestChild с ICommand на ITest, тогда код будет работать нормально.

Кто-нибудь еще был свидетелем такого поведения и / или знает, как его решить?

Я использую VS2008, .NET 3.5 и Castle 2.5.2.

Спасибо, Стюарт

using System;
using System.Windows.Input;  
using Castle.MicroKernel.Registration;  
using Castle.Windsor; 
namespace ConsoleApplication1      
{          
    class Program          
    {              
        static void Main(string[] args)              
        {                  
            var container = new WindsorContainer();

            container.Register(                      
                Component.For().ImplementedBy(),                      
                Component.For().ImplementedBy()                      
            ); 

            var parent = container.Resolve();
        }
    }

    public interface ITest {}

    public class TestParent
    {              
        public TestParent(TestChild testChild) { }
    }  

    public class TestChild : ICommand          
    {              
        public event EventHandler CanExecuteChanged;              
        public bool CanExecute(object parameter) { return true; }              
        public void Execute(object parameter) {}          
    }      
}    
0 голосов
/ 09 декабря 2010

Спасибо за ответы.

Так как корпоративный фильтр на работе отказывается отображать «человеческую» проверку «Captcha», мне пришлось вырезать и вставить с моего iphone ... в любом случае это каким-то образом удалило обобщенные элементы из кодапример, извиняюсь за отсутствие компиляции, не говоря уже о макете fubar ...

Должно выглядеть так:

    private static void Main(string[] args)
    {
        var container = new WindsorContainer();

        container.Register(
            Component.For<TestParent>().ImplementedBy<TestParent>(),
            Component.For<TestChild>().ImplementedBy<TestChild>());

        var parent = container.Resolve<TestParent>();
    }

Регистрация ICommand работает, однако это не решает мою проблему, так какУ меня есть несколько команд в моем реальном приложении, и мне нужно Касла, чтобы различать их.

Мне удалось обойти это, создавая фиктивные интерфейсы для каждой из команд и регистрируя их - не идеально.

Интерфейс ITest должен был разрешить переключение с ICommand и ITest, что решает проблему, т. Е. Проблема связана с WPF ICommand.

Stuart

0 голосов
/ 09 декабря 2010

класс TestParent имеет только один конструктор, который требует передачи параметра объекта.Если бы это был базовый тип данных, такой как int или string, вы могли бы указать его значение в файле App.config.Но вы не можете устанавливать объекты там.В этом случае я рекомендую добавить пустой конструктор (без параметров).

...