Не удается получить Autofac для разрешения ObservableCollection <string> - PullRequest
1 голос
/ 29 января 2011

У меня нет большого опыта программирования, поэтому извините, если это очевидный вопрос.

См. Следующий код. Autofac может разрешить ObservableCollection , но не ObservableCollection .

class Program
{
    static void Main()
    {
        var builder = new ContainerBuilder();
        builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

        using (var container = builder.Build())
        {
            // This line works.
            var x = container.Resolve<ObservableCollection<int>>();
            // This line throws exception: 
            // DependencyResolutionException was unhandled:
            // No constructors on type 'System.Char*' can be found 
            // with 'Public binding flags'.
            var y = container.Resolve<ObservableCollection<string>>();
        }
    }
}

Я использую Autofac 2.4.2 для .NET 4.0.

Есть идеи?

Обновление

Кажется, проблема вызвана:

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

Я заменил его на:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
builder.RegisterGeneric(typeof(ObservableCollection<>))
       .As(typeof(ObservableCollection<>));

Теперь это работает. Но я до сих пор не совсем понимаю, почему.

(простите за мой английский)

1 Ответ

1 голос
/ 30 января 2011

Причина, по которой AnyConcreteTypeNotAlreadyRegisteredSource действует так, заключается в том, что ObservableCollection<string> имеет конструктор, который принимает string. Поскольку string является конкретным типом класса, AnyConcreteTypeNotAlreadyRegistereSource подберет это и попытается разрешить. System.String однако не имеет конструкторов, которые можно вызвать, поэтому вы получаете исключение, которое вы испытываете.

Если вы только начинаете использовать Autofac, я настоятельно рекомендую использовать ACTNARS - он имеет только несколько вариантов использования, и для большинства из них требуется параметр predicate, чтобы избежать непредвиденного поведения, подобного приведенному выше. .

То, что у тебя есть сейчас, - лучший путь. Пара указателей - объявление As() не требуется, если тип службы совпадает с конкретным типом компонента. Кроме того, ObservableCollection<T> редко используется как услуга вообще - если вы можете предоставить более подробную информацию о вашем сценарии, возможно, есть лучший способ выразить это с помощью Autofac.

...