ASP.NET MVC 的 Unity 引导程序(按照惯例)无法在不同的项目中构建接口

Unity bootstrapper for ASP.NET MVC (by convention) not able to construct interfaces in a different project

我有这样的结构:

我在 MyWork.Web 项目中按照约定设置统一。当我离开 Service.cs 并且我 Service.cs 在 MyWork.BLL 下时它工作正常。我正在尝试将 IService.cs 移动到 MyWork.Interfaces 以进行组织和解耦。这样,在处理 Web 项目时,我所需要担心的就是针对界面进行编码并为 MyWork.Interfaces 添加 using 语句。但是,如果我尝试将 IService.cs 移动到界面项目,按照惯例,Unity 将不再有效。有人知道这是否可能吗?我是否必须始终将接口及其实现保持在同一个项目下,以便 Unity 按照惯例正常工作?按照惯例,这是我的 Unity 代码:

public static void RegisterTypes(IUnityContainer container)
    {
            container.RegisterTypes(
            AllClasses.FromLoadedAssemblies(),
            WithMappings.FromMatchingInterface,
            WithName.Default);
    }

这是错误:

当前类型MyWork.Interfaces.IService 是一个接口,无法构造。您是否缺少类型映射?

更新:

UnityConfig.cs 在 App_Start 下 MyWork.Web

namespace MyWork.Web.App_Start
{
public class UnityConfig
{
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<ICalculatorService, Interfaces.ICalculatorService>(); // added this per suggested answer

        container.RegisterTypes(
            AllClasses.FromLoadedAssemblies(),
            WithMappings.FromMatchingInterface,
            WithName.Default);
    }
}

}

我敢打赌 MyWork.Interfaces 程序集尚未加载。 Unity 的 FromLoadedAssemblies 调用只是调用 AppDomain.CurrentDomain.GetAssemblies(),根据定义,它只调用 returns 个加载的程序集(不是所有引用的程序集!)。

这里有两个选项:

  1. RegisterTypes 方法中显式引用 MyWork.Interfaces 程序集中的类型。这确保程序集被加载。
  2. 在调用 container.RegisterTypes 之前调用 System.Web.Compilation.BuildManager.GetReferencedAssemblies()GetReferencedAssemblies() 调用将加载位于 Web 应用程序 /bin 文件夹中的所有程序集。这将确保不仅加载您的 Interfaces 项目,而且加载所有项目。