.net 模块划分-如何正确执行?如何分离存在的能力?

.net 模块划分-如何正确执行?如何分离存在的能力?,.net,design-patterns,class-design,projects-and-solutions,.net,Design Patterns,Class Design,Projects And Solutions,我正在为特定客户编写大型应用程序。 该应用程序包含许多功能,但并非所有客户都需要这些功能,因此经过大量思考,我决定将应用程序的各个部分划分为模块,其中模块是一个独立的部分。 我现在正从我的旧代码开始创建模块。 由于这是一个web应用程序,每个客户都有自己的用户名和密码。我应该只加载他的模块-只有他的模块应该对他可用。 此外,我有两种可以交互的不同功能,有时如果一个客户同时拥有这两种功能,我想公开“组合网页”,而不是特定功能的网页,那么“组合网页”应该在哪个模块中? 我还没有确定模块包括什么。SS

我正在为特定客户编写大型应用程序。 该应用程序包含许多功能,但并非所有客户都需要这些功能,因此经过大量思考,我决定将应用程序的各个部分划分为模块,其中模块是一个独立的部分。 我现在正从我的旧代码开始创建模块。 由于这是一个web应用程序,每个客户都有自己的用户名和密码。我应该只加载他的模块-只有他的模块应该对他可用。 此外,我有两种可以交互的不同功能,有时如果一个客户同时拥有这两种功能,我想公开“组合网页”,而不是特定功能的网页,那么“组合网页”应该在哪个模块中? 我还没有确定模块包括什么。SS模块是否包含自己的数据库表?模块是否包含自己的网页?模块是否有自己的库项目?等等

在所有模块部门中,是否有人可以进行sקnse或下订单?我在这里真的迷路了,我不知道如何继续下去

我将asp.NET与c#和Web服务、jQuery和SQL Server 2005一起使用。

我认为应该允许您执行所需操作:如上所述,您可以按页面或文件夹管理授权。例如,如果您只希望组1中的用户访问Folder1,组2中的用户访问Folder2,以及两者都访问Folder3,则您的Web.config应该如下所示:

<configuration>
    ....
    <!-- Normal config here //-->
    <system.web>
    ....
    </system.web>

    <!-- Page-specific settings for folder1 here //-->
    <location path="folder1">
        <system.web>
            <authorization>
                <allow users="Group1" />
            </authorization>
        </system.web>
    </location>

    <!-- Page-specific settings for folder2 here //-->
    <location path="folder2">
        <system.web>
            <authorization>
                <allow users="Group2" />
            </authorization>
        </system.web>
    </location>

    <!-- Page-specific settings for folder3 here //-->
    <location path="folder3">
        <system.web>
            <authorization>
                <allow users="Group1, Group2" />
            </authorization>
        </system.web>
    </location>
</configuration>

....
....

这不是最复杂的解决方案,但我就是这样做的-
每个用户都由一个用户对象表示,该对象具有AvailableModules属性,或者可能具有一个HasModule(module)函数。
集中式存储库保存代表当前登录用户的对象,任何需要的人都可以查询该对象。
例如,表示层将具有

if (UsersRepository.CurrentUser.HasModule(Module.Admin))
{
labelAdmin.visible = true;
//other presentation stuff here
}
服务层将具有:

public void Do AdminStuff()
{
   if (!UsersRepository.CurrentUser.HasModule(Module.Admin))
   {
     throw new UnauthorizedAccessException("User isn't an admin");
   }
   //do your admin stuff
}
等等。
请注意,您可以使用它将操作分离到不同的类。例如—

public interface ISomeService
{
   public void DoService(();
}
调用代码可以有-

ISomeService service = new ViewerService();
if (UsersRepository.CurrentUser.HasModule(Module.Admin))
{
   service = new AdminService();
}

很难说如何设计模块,因为它是特定于您的应用程序域和体系结构因素的

您可以在应用程序的各个级别定义模块,模块设计可以被视为独立于任何特定语言。请记住,如果不绘制特定的边界,过多的重用(耦合)可能会产生负面影响,因为更改会波及应用程序。一个很好的防御方法是设计预期变化。因此,它将影响整个体系结构

“独立部分”很好,但您需要在体系结构中定义“级别”:您可以有功能模块、“技术”模块(基础架构代码)、运行时模块,甚至部署模块。每种类型在大型应用程序中都很重要

根据您问题中的内容(不知道您的域名是关于什么的),以下是一些建议:

  • 通过提供自己的数据库来隔离web服务。(独立性)
  • 让web服务调用其他web服务(封装/组合)
  • 使用代码、文件或数据库中的配置(每个客户、每个web服务)为客户加载功能模块。(请参阅作为处理配置问题的良好模式。)
  • 使用域/业务需求作为web服务和模块的指南
  • 看一看,尤其是有界上下文。这里有很多模式可以让您了解如何模块化应用程序
  • 预测变化(不要太深),并尝试围绕变化(技术和功能)设计您的体系结构
  • 将应用程序拆分为可重用基础架构(技术)模块的功能模块。分层隔离

注意:这实际上取决于您的域::例如,您可以有一个支持多个用户的应用程序,并且它们仅根据所具有的角色(客户、员工、黄金客户..)进行分离。对于某些用户,您甚至可能有单独的web服务,但它们都可以仅为用户界面使用“web演示/应用程序”服务。

您正在寻找的是所谓的多租户解决方案,这并不是什么新鲜事。有几种不同的解决方案可用

首先:习惯于所有模块都是为每个人同时加载的。除非您想开始处理appdomains,否则其他任何事情都是不可能的。这会很快变得很糟糕

您所做的只是控制为用户显示哪些链接等,并验证所有请求,以便用户有权执行其尝试执行的操作

至于权限处理,我正在使用.Net中内置的。我为用户有权访问的每个模块添加了一个角色。通过这种方式,我可以使用
[PrincipalPermission(XXXX)]
属性标记我的所有方法,以控制安全性。阅读自定义
i原则
i身份

接下来要解决的是代码布局。我每个模块有一个类库。在该模块中,我有所有层(存储库、模型、服务、视图)。所有内容都标记为
internal
,但应向系统其余部分公开的类除外

你需要一些东西来把一切联系在一起,这是最棘手的部分。您需要仔细考虑要创建哪些接口才能让模块彼此交互

我建议您使用反转控制容器(我最喜欢的是autofac)和Asp.NET MVC,因为两者都提供