C# 在我的项目架构中,我应该在哪里放置自定义成员资格提供程序?

C# 在我的项目架构中,我应该在哪里放置自定义成员资格提供程序?,c#,asp.net,n-tier-architecture,C#,Asp.net,N Tier Architecture,4个月前,我开始学习如何构建N层web应用程序,但我仍然不完全理解将所有内容放在何处。我的体系结构基于Scott Millett的《专业ASP.NET设计模式》一书,如下所示: 项目控制器 项目.基础设施 项目模型 Project.Repository.NHibernate 项目.服务 Project.UI.Web.MVC 在他的案例研究中,他在基础设施项目中使用了标准成员资格提供者。如果我想创建另一个web应用程序,我可以轻松地将基础设施项目添加到解决方案中,并准备好使用成员资格 但我想创

4个月前,我开始学习如何构建N层web应用程序,但我仍然不完全理解将所有内容放在何处。我的体系结构基于Scott Millett的《专业ASP.NET设计模式》一书,如下所示:

  • 项目控制器
  • 项目.基础设施
  • 项目模型
  • Project.Repository.NHibernate
  • 项目.服务
  • Project.UI.Web.MVC
在他的案例研究中,他在基础设施项目中使用了标准成员资格提供者。如果我想创建另一个web应用程序,我可以轻松地将基础设施项目添加到解决方案中,并准备好使用成员资格


但我想创建自己的自定义成员资格提供程序,使用NHibernate。我是否应该在我的服务项目中为其创建服务,并在我的repository.NHibernate项目中为其创建存储库?还是我应该继续使用基础设施项目并在其中创建这些项目,以便在其他项目中重用它?

不要过度设计您的解决方案,这些东西没有真正的对错。做最简单的事情来解决您的问题并提供功能

所以最大的问题是,当您可以使用SqlMembershipProvider实现同样的功能时,为什么要这样做(当然,除非您正在更改使用aspnet_regsql命令创建的表结构)

不管怎么说,撇开问题不谈,我倾向于遵循微软的名称空间约定。因此,在您的案例中,我将在您的解决方案中创建一个名为YourCompany.Web.Security的新类库,然后在名为YourCompany.Web.Security.hibernateMemembershipprovider的命名空间中创建提供程序类。您的所有存储库、服务和其他垃圾都将放入此程序集中

现在更大的问题是关于数据存储的学术问题。根据我的经验,最好不要将身份和“常规”配置文件数据与应用程序数据放在同一个数据库中。因此,这个新程序集应该检查您正在连接的数据库实例,并创建表等来支持您的成员资格需求(假设您正在实现一个完整的提供程序)

您可能还需要编写自己的web/windows应用程序来管理用户

因此,当SqlMembershipProvider已经存在所有这些时,我真的很怀疑您所做的事情的价值


已经说过了,对于调查.NET 4.5的新微软身份基础(WIF)特性和使用Azure来管理身份数据有很多要说的。设置起来很容易。

虽然我完全同意彼得和莫迪卡的观点,但我想补充几点

在设计应用程序时,你需要理解将这些东西放在不同项目中的原因,并彻底理解关注点的分离。也就是说,你需要知道你要分离的是什么,为什么你会担心它

我没有读过那本书,所以我对作者的方法没有评论。无论如何,在离开之前,相信作者命名的东西是“专业”的方式,停止和考虑不仅你的应用程序,而且也如何像.NETFramework本身的结构。 在任何给定的项目上,您可能必须生成几种类型的工件,包括:数据访问代码、对象模型、UI、业务逻辑等

有几个自然边界区域。例如,您可能希望将数据访问代码分离出来,以防需要交换永久存储选项,甚至只是交换访问方法,如使用LINQ、NHibernate或您拥有的其他方法

您可能希望在其他解决方案中重用对象模型;或者您甚至可能希望支持交换UI部件,比如从WebForms到MVC再到其他任何东西。。您甚至可能需要对对象模型应用不同的业务逻辑,这取决于对象模型的使用方式或使用对象的人

也就是说,并非每个应用程序都有相同的结构需求。例如,如果没有业务逻辑,对象模型可能完全没有意义;或者,更有可能的是,某些逻辑绝对必须与类定义合并,而其他逻辑特定于库的使用方式。如果是前者,那么您有充分的理由将业务逻辑放在与类定义完全相同的项目/程序集中。如果是后者,那么您可能希望将其分离到其他程序集中,并实现对象的接口定义

根据我的经验,如果你不知道,就把它放在一起,因为这是最简单的选择,如果情况需要的话,可以在以后重构你想要的东西

如果您在早期过度设计,那么您会增加项目时间/成本,从而产生可能永远无法实现的潜在利益;这很少是一个好的决定。还有一个问题是,你不知道将来可能需要什么,现在分离可能意味着你今天增加了项目时间,以后还要重构,这是一个双重打击。真正专业的开发人员IMHO在评估潜在解决方案时会考虑成本/开发时间


现在,我们来讨论一下定制的成员资格提供程序的具体需求,它很有可能在其他项目中重用。自定义提供程序应该位于它自己的项目和命名空间中。我可能会使用类似于
Company.Security
的名称空间。这将提供最佳的可移植性方法,允许您只重用相关代码,而不必拖拽这一项目特有的所有其他内容

因为它使用了提供者模型,所以在其他项目中不应该有需要直接引用该模型的代码。只需使用接口即可