一个坚实有组织的架构应该如何?

时间:2012-08-10 12:40:41

标签: c# asp.net-mvc-3 entity-framework architecture

在工作中,我们即将重新编写一个旧应用程序,并且我被告知要了解我们如何做到这一点。

我的想法如下:

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

到目前为止,架构应如下所示:   - 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是我最后的关注点。

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

实际问题

如果有的话,有人可以指点任何支持这些功能的架构设计吗?

2 个答案:

答案 0 :(得分:3)

我非常喜欢herehere所述的SOLID架构原则。在做出最终决定之前,他们值得检查并飙升。 DotNetJunkie还将发布另一篇关于如何在不久的将来与WCF一起使用这些模式的博客文章。他描述的接口和模式足够分离,可以与EF或NHibernate一起使用。

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

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

我喜欢你有一个项目的“三脚架”的想法。尽量不要让你的解决方案中的项目数大于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项目依赖于其他两个。

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

答案 1 :(得分:1)

阅读Onion Architecture。这基本上就是你正在做的事情,详细说明。

在最后一部分中,有一些示例项目的链接,您可以在这些项目中找到想法放置的地方。当我遇到同样的问题时,这对我帮助很大。