【发布时间】:2011-06-27 22:44:22
【问题描述】:
我正在查看 Martin Fowler 撰写的一篇名为 Dealing With Roles 的论文。在其中,Fowler 阐述了处理组织中人员(即员工、工程师、经理、销售员)角色的三种基本策略,包括角色子类型、角色对象和角色关系。
它是在 1997 年编写的,它肯定很旧,而且作为一个“工作草案”,它也有一些错误,否则就不会出现。我对他经历的角色对象的示例感到困惑,并且在下面包含了我对他的一些 java 代码的 c# 解释。
我有三个问题:
(1) 有很多类型识别是用字符串完成的,看起来应该可以用泛型替换,但我还不知道如何做到这一点。您将如何使用泛型实现此代码?
(2) JobRole 在代码中作为类型的字符串名称,但没有在其余代码中专门定义。我不知道这是否是 PersonRole 的基类。 JobRole的解释是什么?单元测试看起来像模式用法的正确示例吗?
(3) 有没有人有任何关于使用角色对象的最新实现和示例的链接?
干杯,
浆果
public class PersonWithRoles : Person
{
private readonly IList<PersonRole> _roles = new List<PersonRole>();
public static PersonWithRoles CreatePersonWithRoles(string identifierName) {
...
}
public void AddRole(PersonRole role) { _roles.Add(role); }
public PersonRole RoleOf(string typeName) { return _roles.FirstOrDefault(x => x.HasType(typeName)); }
}
public class PersonRole
{
public virtual bool HasType(string typeName) { return false; }
}
public class Salesman : PersonRole
{
public override bool HasType(string typeName)
{
if (typeName.Equals("Salesman", StringComparison.InvariantCultureIgnoreCase)) return true;
if (typeName.Equals("JobRole", StringComparison.InvariantCultureIgnoreCase)) return true;
return base.HasType(typeName);
}
public int NumberOfSales { get; set; }
}
[TestFixture]
public class RoleUsageTests
{
[Test]
public void Test() {
var p = PersonWithRoles.CreatePersonWithRoles("Ted");
var s = new Salesman();
p.AddRole(s);
var tedSales = (Salesman) p.RoleOf("Salesman");
tedSales.NumberOfSales = 50;
}
}
【问题讨论】:
标签: c# design-patterns domain-driven-design