ASP.NET MVC 应用程序中的 IRepository、IService、Unity,参考问题

发布于 2024-09-28 23:16:13 字数 948 浏览 5 评论 0原文

我是 Unity 的新手,但这个问题对于 IoC 来说更通用,而且我对整体实现 IoC 还很陌生。我有具有以下项目结构的 VS2010 解决方案(稍微简化):

  • 业务对象 – 文件夹
    • DomainModel(类库项目)– Entity Framework 2 POCO 实体
  • 数据层 – 文件夹
    • DataAccess(类库项目)- EF2 EDMX
    • Repository(类库项目)——IRepository 接口&存储库具体实现
  • 表示层 - 文件夹
    • WebUI – MVC 项目
  • 服务层
    • Service(类库项目)——IService 接口和服务(外观模式)具体实现

所有项目都引用 DomainModel 项目。

存储库引用 DataAccess 项目。

服务层引用存储库项目。

WebUI引用了Service项目& Unity 程序集。

我已将 Unity 配置为在 WebUI 中正确注入所有服务类型(通过自定义 UnityControllerFactory.cs 的 global.asax)。但是如何在服务层配置 Unity 来注入存储库对象呢?

我不想从 WebUI 引用 Repository 项目,以确保在开发过程中没有人走捷径并绕过服务层。

我有几个想法(不确定是否能解决这个问题):

  1. 将 IRepository 接口移至 DomainModel 中并添加 Unity.RegisterType<>调用 IRepository
  2. 在 Web.config 中设置 Unity 配置

任何方向都将不胜感激,特别是如何为服务层/存储库配置 Unity,而且还涉及项目的一般情况。

I'm new to Unity, but this question is more generic to IoC, and I’m pretty new to implementing IoC as a whole. I have VS2010 solution with this project structure (simplified slightly):

  • Business Objects – Folder
    • DomainModel (Class Lib prj.) – Entity Framework 2 POCO entities
  • Data Layer – Folder
    • DataAccess (Class Lib prj.) – EF2 EDMX
    • Repository (Class Lib prj.) – IRepository interface & repository concrete implementations
  • Presentation Layer – folder
    • WebUI – MVC Project
  • Service Layer
    • Service (Class Lib prj.) – IService interface and service (façade pattern) concrete implementations

All project reference the DomainModel project.

Repository references the DataAccess project.

Service Layer references the Repository project.

WebUI references the Service project & the Unity assemblies.

I have Unity configured to inject all my service types correctly in the WebUI (global.asax via a custom UnityControllerFactory.cs). But how do I configure Unity in the service layer to inject the repository objects?

I DON’T want to reference the Repository project from the WebUI to ensure during development no one shortcuts and bypass the Service layer.

Couple Ideas I have (not sure if it will solve it):

  1. Move the IRepository Interfaces into the DomainModel and add the Unity.RegisterType<> calls for the IRepository
  2. Set up Unity configuration in the Web.config

Any direction would be greatly appreciated, specifically to how to configure Unity for the service layer / Repository, but also in general about the project.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

べ映画 2024-10-05 23:16:13

在服务项目中添加某种引导程序。然后在 WebUI 中引用引导程序。

实现此目的的一种方法是编写一个小型 Unity 扩展。像这样:

public class ServiceLayerBootstrap : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IRepository, WhateverRepositoryImplementation>();
        // etc.
    }
}

然后,在创建容器并初始化它的 Web 项目中,执行以下操作:

var container = new UnityContainer()
    .AddNewExtension<ServiceLayerBootstrap>();

Add a bootstrapper of some sort in the Service project. Then reference the bootstrapper in the WebUI.

One way to do this would be to write a small Unity extension. Something like this:

public class ServiceLayerBootstrap : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IRepository, WhateverRepositoryImplementation>();
        // etc.
    }
}

Then, in the web project where you create the container and initialize it, do this:

var container = new UnityContainer()
    .AddNewExtension<ServiceLayerBootstrap>();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文