我没有太多的编程经验,很抱歉,如果这是一个显而易见的问题。
请参阅以下代码。 Autofac可以解析ObservableCollection< int>,但不能解析ObservableCollection< 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<>));
现在它有效。但我仍然不太明白为什么。
(对不起我的英文)
答案 0 :(得分:1)
AnyConcreteTypeNotAlreadyRegisteredSource
这种行为的原因是ObservableCollection<string>
有一个带string
的构造函数。由于string
是一个具体的类类型,AnyConcreteTypeNotAlreadyRegistereSource
会选择它并尝试解决它。 System.String
但是没有任何可调用的构造函数,因此您将获得正在经历的异常。
如果您刚开始使用Autofac,我强烈建议不要使用ACTNARS
- 它只有一些用例,其中大多数都需要提供predicate
参数以避免意外像上面这样的行为。
你现在所拥有的是最好的方式。一些指针 - 当服务类型与具体组件类型相同时,不需要As()
声明。此外,ObservableCollection<T>
根本不常用作服务 - 如果您可以提供有关您的方案的更多详细信息,可能有更好的方法来使用Autofac表达它。