1

在工作中,我们即将重写一个旧应用程序,我被告知要获得一些关于如何做到这一点的想法。

我的想法如下:

由于该应用程序将主要是一个网站,因此我将使用 MVC。用于 DI 和 IoC 的带有 POCO 实体的 EF。Web 应用程序和其他客户端将使用的服务的 WCF。

到目前为止,架构应该如下所示: - Demo.Web - Demo.Entities - Demo.Services

现在我的架构是这样的:

命名空间 Demo.Entities

// IEntity.cs
public interface IEntity { }

//User.cs
public virtual long UserId { get; private set; }
public virtual string Name { get; private set; }

public User() { }
public User(long userId, string name)
{
    UserId = userId;
    Name = name;
}

命名空间 Demo.Services

// IService.cs
public interface IService<T> : IDisposable where T : IEntity
{
    List<T> GetList();
}

// UserService.cs
public class UserService : IService<User>
{
    public List<User> GetList()
    {
        return new List<User>(); // Simplicity
    }

    public void Dispose() { }
}

当我需要使用它时,我会这样做:

using(IService<User> service = new UserService())
{
    var q = service.GetList();
}

至于 MVC,我将使用 Demo.Models 中的模型,如果需要实际模型,我会将它们链接到我的 MVC 应用程序的 Models 文件夹,但现在 MVC 是我最不关心的问题。

到目前为止,我已经检测到一个问题,如果不实例化指定的服务,我将无法查询多个实体。从好的方面来说,我可以完全控制处理我的数据的内容和方式。

实际问题

如果有的话,谁能指出我支持这些功能的任何架构设计?

4

2 回答 2

3

我非常喜欢这里这里描述的 SOLID 架构原则。在您做出最终决定之前,它们值得一试。DotNetJunkie 还将在不久的将来发布另一篇关于如何将这些模式与 WCF 一起使用的博客文章。他描述的接口和模式已经足够解耦,可以将它们与 EF 或 NHibernate 一起使用。

我在您的帖子中看到的一个问题是 IEntity 接口。我认为你不需要为你的基本实体提供一个接口,通常一个抽象基类就足够了(即使用 Layer Supertype 模式)。我从来没有找到让所有实体都订阅单个接口合同的理由。

在您的示例中,我也没有看到任何依赖注入。任何使用using(IService<User> ctx = new UserService())的代码都依赖于接口和实现。您希望 MVC 或其他客户端代码仅对接口具有硬依赖,并通过控制容器的反转解析/注入具体实现。这是trailmax 发布的洋葱架构中常见的一种模式。

我确实喜欢你有一个项目“三脚架”的想法。尽量不要让您的解决方案中的项目数量超过大约 5 个项目(不包括单元测试项目,这些不包括在内)。

到目前为止,我已经检测到一个问题,如果不实例化指定的服务,我将无法查询多个实体。从好的方面来说,我可以完全控制处理我的数据的内容和方式。

同样,这些问题可以通过阅读和采用我上面提到的文章中描述的ICommandHandlerIQueryHandler/IQueryProcessor模式来解决。您根本不必实例化任何服务。您只需将构造函数注入IQueryProcessorICommandHandler<TCommand>您的控制器中,然后让 IoC 容器提供实现。如果您有一个需要查询多个实体的操作,您只需在查询Handle方法中访问 EF 或 NHibernate 即可。

这是我使用这些模式的一个项目的示例:

MyApp.Domain.csproj

包含所有实体以及 DotNetJunkie 接口和命令 + 查询实现的类库。这不依赖于实体框架或任何其他项目。

MyApp.Impl.csproj

包含接口实现的类库,以及 EF DbContext 和 IoC 容器。这需要对 Domain 项目以及 EF、IoC 库等的依赖。

MyApp.Mvc.csproj

MVC 项目依赖于另外两个。

这是洋葱架构的一个非常基本的示例。

于 2012-08-10T13:10:06.157 回答
1

阅读洋葱架构。这基本上就是你正在做的,详细说明。

在最后一部分中,有指向示例项目的链接,您可以在其中找到将东西放在哪里的想法。当我面临同样的问题时,这对我帮助很大。

于 2012-08-10T13:05:37.037 回答