iisreset后Unity注册失败

时间:2015-05-15 16:56:15

标签: dependency-injection unity-container asp.net-web-api

我正在注册一大堆依赖项。

container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default,
overwriteExistingMappings: true);

这样可以很好地注册,并且正确配置了web api端点。 如果我做iisreset或者只是稍等一下,那么事情就会失败

错误消息不是非常有用

"exceptionMessage": "An error occurred when trying to create a controller of type 'ApiController'. Make sure that the controller has a parameterless public constructor.",

控制器当然没有,也不应该有。

我不确定发生了什么......但如果我明确注册了依赖项

 container.RegisterType<IDoAThing, Domain.Things.DoAThing>(new HierarchicalLifetimeManager());

然后一切正常。

我怎样才能按照惯例获得&#39;注册继续工作?

1 个答案:

答案 0 :(得分:4)

iisreset之后,在Unity注册开始之前,程序集尚未加载到应用程序域中。

由于您使用的是辅助方法AllClasses.FromLoadedAssemblies(),因此它不会在尚未加载的程序集中注册类。

尝试使用BuildManager.GetReferencedAssemblies获取引用的程序集,这将获取bin文件夹中的程序集列表。然后使用这些程序集和AllClasses.FromAssemblies辅助方法执行Unity注册。

.RegisterTypes(
    AllClasses.FromAssemblies(
             BuildManager.GetReferencedAssemblies().Cast<Assembly>()),
    WithMappings.FromMatchingInterface,
    WithName.Default,
    overwriteExistingMappings: true);   

在最糟糕的情况下,您可以使用每个程序集中的一个众所周知的类,通过反射获取它的装配,并将其用于注册,如此简化示例:

.RegisterTypes(
    AllClasses.FromAssemblies(typeof(Foo).Assembly),
    WithMappings.FromMatchingInterface,
    WithName.Default,
    overwriteExistingMappings: true);
相关问题