无法让Autofac解析ObservableCollection <string> </string>

时间:2011-01-29 06:51:35

标签: autofac

我没有太多的编程经验,很抱歉,如果这是一个显而易见的问题。

请参阅以下代码。 Autofac可以解析ObservableCollection&lt; int&gt;,但不能解析ObservableCollection&lt; string&gt ;.

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 for .NET 4.0。

有什么想法吗?

更新

似乎问题是由以下原因造成的:

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

我将其替换为:

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

现在它有效。但我仍然不太明白为什么。

(对不起我的英文)

1 个答案:

答案 0 :(得分:1)

AnyConcreteTypeNotAlreadyRegisteredSource这种行为的原因是ObservableCollection<string>有一个带string的构造函数。由于string是一个具体的类类型,AnyConcreteTypeNotAlreadyRegistereSource会选择它并尝试解决它。 System.String但是没有任何可调用的构造函数,因此您将获得正在经历的异常。

如果您刚开始使用Autofac,我强烈建议不要使用ACTNARS - 它只有一些用例,其中大多数都需要提供predicate参数以避免意外像上面这样的行为。

你现在所拥有的是最好的方式。一些指针 - 当服务类型与具体组件类型相同时,不需要As()声明。此外,ObservableCollection<T>根本不常用作服务 - 如果您可以提供有关您的方案的更多详细信息,可能有更好的方法来使用Autofac表达它。