在工作中,我们要重写一个旧的应用程序,我被告知要想出一些方法来完成它。
我的想法如下:
由于应用程序将主要是一个网站,我会使用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是我最后关心的问题。
到目前为止,我已经检测到一个问题,如果不实例化指定的服务,我将无法查询多个实体。好的一面是,我完全控制了我的数据被处理的内容和方式。
实际问题
如果有的话,有人能告诉我支持这些功能的任何架构设计吗?
发布于 2012-08-10 13:10:06
我非常喜欢描述这里和这里的坚实的体系结构原则。在你做出最后决定之前,它们是值得检查和补充的。DotNetJunkie还将在不久的将来发布另一篇关于如何在WCF中使用这些模式的博客文章。他描述的接口和模式已经足够解耦,可以与EF或NHibernate一起使用。
我在您的文章中看到的一个问题是IEntity接口。我不认为您需要为您的基本实体提供一个接口,通常一个抽象基类就足够了(即使用层Supertype模式)。我从来没有找到让所有实体订阅单一接口契约的理由。
在您的示例中,我也没有看到任何依赖注入。任何使用using(IService<User> ctx = new UserService())的代码都依赖于接口和实现。您希望MVC或其他客户端代码只在接口上具有硬依赖关系,并通过控制容器的反转来解决/注入具体的实现。这是trailmax贴出的洋葱建筑中常见的模式。
我喜欢你的想法,有一个“三脚架”的项目。但是,尽量不要让解决方案中的项目超过5个项目(不包括单元测试项目,这些项目不算在内)。
到目前为止,我已经检测到一个问题,如果不实例化指定的服务,我将无法查询多个实体。好的一面是,我完全控制了我的数据被处理的内容和方式。
同样,可以通过阅读和采用我前面提到的文章中描述的ICommandHandler和IQueryHandler / IQueryProcessor模式来处理这些问题。您根本不必实例化任何服务。您只需构造函数--将IQueryProcessor或ICommandHandler<TCommand>注入控制器,并让IoC容器提供实现。如果您的操作需要查询多个实体,则只需访问查询的Handle方法中的EF或Handle即可。
下面是我使用这些模式的一个项目的示例:
MyApp.Domain.csproj
类库,它包含所有实体以及DotNetJunkie接口,以及命令+查询实现。这不需要依赖实体框架或任何其他项目。
MyApp.Impl.csproj
类库,它包含接口的实现,以及EF DbContext和IoC容器。这需要依赖于域项目以及EF、IoC库等。
MyApp.Mvc.csproj
MVC项目依赖于另外两个项目。
这是洋葱建筑的一个非常基本的例子。
发布于 2012-08-10 13:05:37
阅读一下洋葱建筑。这基本上就是你正在做的,详细阐述。
在最后一部分中,有指向示例项目的链接,您可以在那里获取想法,把东西放在哪里。当我面临同样的问题时,这对我有很大的帮助。
https://stackoverflow.com/questions/11901872
复制相似问题