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

C# 一个坚实而有组织的架构应该是怎样的?,c#,asp.net-mvc-3,entity-framework,architecture,C#,Asp.net Mvc 3,Entity Framework,Architecture,在工作中,我们将要重新编写一个旧的应用程序,有人告诉我如何才能做到这一点 我的想法如下: 由于应用程序将主要是一个网站,我会使用MVC。EF与DI和IoC的POCO实体。web应用程序和其他客户端将使用的服务的WCF 到目前为止,架构应该是这样的: -Demo.Web -演示。实体 -演示服务 现在,我的体系结构如下所示: 名称空间Demo.Entities 命名空间Demo.Services 当我需要使用此功能时,我会: 至于MVC,我将使用Demo.models中的模型,如果需要实际的模型,

在工作中,我们将要重新编写一个旧的应用程序,有人告诉我如何才能做到这一点

我的想法如下:

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

到目前为止,架构应该是这样的: -Demo.Web -演示。实体 -演示服务

现在,我的体系结构如下所示:

名称空间Demo.Entities

命名空间Demo.Services

当我需要使用此功能时,我会:

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

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

实际问题

如果有的话,有谁能告诉我支持这些功能的建筑设计吗?

请阅读。这基本上就是你正在做的,详细阐述

在最后一部分中,有一些指向示例项目的链接,您可以从中获得一些想法,将它们放在何处。当我面临同样的问题时,这对我帮助很大。

请继续阅读。这基本上就是你正在做的,详细阐述


在最后一部分中,有一些指向示例项目的链接,您可以从中获得一些想法,将它们放在何处。当我面临同样的问题时,这对我帮助很大。

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

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

在您的示例中,我也没有看到任何依赖项注入。任何使用usingIService ctx=newuserservice的代码都依赖于接口和实现。您希望您的MVC或其他客户机代码仅对接口具有硬依赖性,并通过控制反转容器解析/注入具体实现。这是一种常见的模式

我很喜欢你的三脚架计划。尽量不要让解决方案中的项目数超过5个项目,尽管排除单元测试项目,这些项目不算

到目前为止,我已检测到一个问题,无法查询多个问题 没有实例化指定服务的实体。乐观地 在这方面,我完全可以控制我的数据被处理的内容和方式

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

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

MyApp.Domain.csproj

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

MyApp.Impl.csproj

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

MyApp.Mvc.csproj

MVC项目依赖于其他两个项目


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

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

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

在您的示例中,我也没有看到任何依赖项注入。任何使用usingIService ctx=newuserservice的代码都依赖于接口和实现。您希望您的MVC或其他客户机代码仅对接口具有硬依赖性,并通过控制反转容器解析/注入具体实现。这是一种常见的模式

我很喜欢你的三脚架计划。尽量不要让解决方案中的项目数超过5个项目,尽管排除单元测试项目,这些项目不算

到目前为止,我已检测到一个问题,无法查询多个问题 没有实例化指定服务的实体。乐观地 在这方面,我完全可以控制我的数据被处理的内容和方式

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

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

MyApp.Domain.csproj

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

MyApp.Impl.csproj

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

MyApp.Mvc.csproj

MVC项目依赖于其他两个项目


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

我使用了一个非常类似的架构来重写我们的旗舰产品。唯一的区别是我们使用了nHibernate。重写决定是在大约2年前做出的,当时EF还不够成熟,我们无法使用,所以我们选择使用nHibernate。到目前为止,架构正在为我们工作,希望它能保持这种状态。顺便说一句,我们正在考虑使用新的REST服务而不是WCF来构建我们的新REST服务。唯一的区别是我们使用了nHibernate。重写决定是在大约2年前做出的,当时EF还不够成熟,我们无法使用,所以我们选择使用nHibernate。到目前为止,架构正在为我们工作,希望它能保持这种状态。顺便说一句,我们正在考虑使用新的REST来构建我们的新REST服务,而不是使用WCF。
// 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;
}
// 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();
}