ASP.NET MVC 的 Unity 引导程序(按照惯例)无法在不同的项目中构建接口
Unity bootstrapper for ASP.NET MVC (by convention) not able to construct interfaces in a different project
我有这样的结构:
- MyWork.BLL
- MyWork.DAL
- MyWork.Interfaces
- MyWork.Models
- MyWork.Web
我在 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 个加载的程序集(不是所有引用的程序集!)。
这里有两个选项:
- 在
RegisterTypes
方法中显式引用 MyWork.Interfaces
程序集中的类型。这确保程序集被加载。
- 在调用
container.RegisterTypes
之前调用 System.Web.Compilation.BuildManager.GetReferencedAssemblies()
。 GetReferencedAssemblies()
调用将加载位于 Web 应用程序 /bin 文件夹中的所有程序集。这将确保不仅加载您的 Interfaces
项目,而且加载所有项目。
我有这样的结构:
- MyWork.BLL
- MyWork.DAL
- MyWork.Interfaces
- MyWork.Models
- MyWork.Web
我在 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 个加载的程序集(不是所有引用的程序集!)。
这里有两个选项:
- 在
RegisterTypes
方法中显式引用MyWork.Interfaces
程序集中的类型。这确保程序集被加载。 - 在调用
container.RegisterTypes
之前调用System.Web.Compilation.BuildManager.GetReferencedAssemblies()
。GetReferencedAssemblies()
调用将加载位于 Web 应用程序 /bin 文件夹中的所有程序集。这将确保不仅加载您的Interfaces
项目,而且加载所有项目。