Polymorphism + DDD
本文关键字:DDD Polymorphism | 更新日期: 2023-09-27 17:49:42
在我的第一个真正的DDD项目中,我被一些关于在这种情况下采取哪种方法的疑问所困扰…
我有一个分布式架构,其中几个应用程序的用户将只有一个帐户,使他们能够进行身份验证。这个帐户可以在我们自己的系统上创建,或者用户可以与我们分享他的登录与facebook,谷歌和其他第三方帐户提供商。
因此,有一个项目专门用于此目的,控制用户帐户。
这种情况使我在我的模型(简化)中采用了这种方法:
public class User
{
public User(string name)
{
Id = Guid.NewGuid();
Name = name;
}
public Guid Id { get; protected set; }
public string Name { get; protected set; }
}
public abstract class Account
{
protected Account(User user)
{
Id = Guid.NewGuid();
User = user;
}
public Guid Id { get; protected set; }
public User User { get; protected set; }
}
public class MySystemAccount : Account
{
public MySystemAccount(string email, string password, User user)
: base(user)
{
Email = email;
Password = password;
}
public string Email { get; protected set; }
public string Password { get; protected set; }
}
public class FacebookAccount : Account
{
public FacebookAccount(string facebookId, User user)
: base(user)
{
FacebookId = facebookId;
}
public string FacebookId { get; protected set; }
}
问题是其他应用程序将通过REST服务访问这个项目。
所以,我考虑了一个单一/认证服务,它将提供一个动态形式的json。它可以生成带有电子邮件/密码的json,也可以生成带有facebookId的json。
那么,我如何连接这些图层呢?
我想做一个应用程序服务,但我被困在谁以及如何决定将要发生什么,我的rest服务应该与应用程序进行什么通信以及应用程序如何知道要做的事情,无论是哪种身份验证,来自我自己域的用户还是来自facebook的用户等等。
对此有什么想法吗?
谢谢!
这似乎是一个多部分的问题——一部分是关于对象模型和多态性的,另一部分是关于体系结构的。
关于对象模型,在这个场景中使用继承并不理想。Account
的每个子类型都不会有太多的特定行为,或者根本没有任何行为。唯一的专门化是不同数据字段的存在。此外,使用继承会使持久性复杂化。
在架构上,我认为你想要实现的是联邦身份。这基本上将用户(身份)的概念与身份验证过程解耦。反过来,这允许所有剩余的应用程序代码绕过身份验证问题,只依赖于用户的身份。看看OpenID和DotNetOpenAuth库,后者在c#中提供了一个OpenID实现。
我是新的Stackoverflow,所以不知道如何把这作为一个"建议",但我会重新考虑你的模型一点点。我认为"用户"严格来说是指通过您自己的网站使用您的应用程序的人。这个"用户"将按照您的建议通过您自己系统的帐户或通过开放ID或OAuth ID提供商(如Facebook和Google)进行身份验证。
如果一个应用程序想要通过REST调用访问你的"应用程序",那么我会让它们通过不同的身份验证机制。对我来说,在某种意义上,您提供的是API层和软件即服务。我想看看Twitter、Facebook或Google是如何公开它们的api供其他应用程序使用的。通常,在对REST调用进行身份验证时涉及到一个密钥和应用程序ID。