首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个坚实而有组织的架构应该是怎样的?

一个坚实而有组织的架构应该是怎样的?
EN

Stack Overflow用户
提问于 2012-08-10 12:40:41
回答 2查看 1.4K关注 0票数 1

在工作中,我们要重写一个旧的应用程序,我被告知要想出一些方法来完成它。

我的想法如下:

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

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

现在我的架构是这样的:

命名空间Demo.Entities

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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() { }
}

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

代码语言:javascript
复制
using(IService<User> service = new UserService())
{
    var q = service.GetList();
}

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

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

实际问题

如果有的话,有人能告诉我支持这些功能的任何架构设计吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-10 13:10:06

我非常喜欢描述这里这里的坚实的体系结构原则。在你做出最后决定之前,它们是值得检查和补充的。DotNetJunkie还将在不久的将来发布另一篇关于如何在WCF中使用这些模式的博客文章。他描述的接口和模式已经足够解耦,可以与EF或NHibernate一起使用。

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

在您的示例中,我也没有看到任何依赖注入。任何使用using(IService<User> ctx = new UserService())的代码都依赖于接口和实现。您希望MVC或其他客户端代码只在接口上具有硬依赖关系,并通过控制容器的反转来解决/注入具体的实现。这是trailmax贴出的洋葱建筑中常见的模式。

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

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

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

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

MyApp.Domain.csproj

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

MyApp.Impl.csproj

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

MyApp.Mvc.csproj

MVC项目依赖于另外两个项目。

这是洋葱建筑的一个非常基本的例子。

票数 3
EN

Stack Overflow用户

发布于 2012-08-10 13:05:37

阅读一下洋葱建筑。这基本上就是你正在做的,详细阐述。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11901872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档