Ber*_*ryl 6 c# design-patterns domain-driven-design
我正在看马丁福勒所做的一篇名为" 处理角色"的文章.在其中,Fowler为组织中的人员(即员工,工程师,经理,推销员)处理角色分析了三个基本策略,其中包括角色子类型,角色对象和角色关系.
在1997年写完它肯定是旧的,作为一个"工作草案"它也有一些错误,否则将不存在.我很困惑看到他经历的一个角色对象的例子,并且包含了我对他下面的一些Java代码的c#解释.
我有三个问题:
(1)有很多类型标识用字符串完成,看起来它应该可以用泛型替换,但我还不知道怎么做.你将如何使用泛型实现此代码?
(2)JobRole在代码中作为类型的字符串名称,但没有使用其余代码明确定义.我不知道这是否是PersonRole的基类.JobRole的定义是什么?单元测试看起来像是模式用法的正确示例吗?
(3)是否有人与更新的实现和使用角色对象的示例有任何关联?
干杯,
Berryl
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我相信这些类型的应用程序是使用装饰器设计模式的良好候选者,其中有一个Person基类,然后每个角色扩展该基类.基类没有权限声明 - 只有扩展person的角色类才应该.
抱歉模糊不清,但我希望你得到我想要描述的内容.
class programmer {
name ...
email ...
seat location ...
}
class html_coder extends programmer {
canCodeHTML ...
}
class script_coder extends programmer {
canCodeHTML ...
canCodeJavascript ...
}
class senior_developer extends programmer {
canCodeHTML ...
canCodeJavascript ...
canAccessDatabase ...
canEditProjectArchitectureFiles ...
canWearTennisShoesToWork...
}
Run Code Online (Sandbox Code Playgroud)
这些都扩展了程序员基类...注意程序员类没有声明权限......只是属性