Роли, Абстрактная Картина, Свободное Соединение
Представим, что мы получили следующее:
A) Заводской интерфейс, такой как
public interface IEmployeeFactory
{
IEmployee CreateEmployee(Person person, Constants.EmployeeType type, DateTime hiredate);
}
Б) бетонный завод, такой как
public sealed class EmployeeFactory : Interfaces.IEmployeeFactory
{
public Interfaces.IEmployee CreateEmployee(Person person, Constants.EmployeeType type, DateTime hiredate)
{
switch(type)
{
case BusinessObjects.Common.Constants.EmployeeType.MANAGER:
{
return new Concrete.Manager(person, hiredate);
}
case BusinessObjects.Common.Constants.EmployeeType.SALES:
{
return new Concrete.Sales(person, hiredate);
}
default:
{
throw new ArgumentException("Invalid employee type");
}
}
}
}
C) семейство сотрудников: Manager
и Sales
, унаследованное от абстрактного сотрудника.
Подробнее о моей простой архитектуре
Некоторый клиентский код
public sealed class EmployeeFactoryClient
{
private Interfaces.IEmployeeFactory factory;
private IDictionary<String, Interfaces.IEmployee> employees;
public Interfaces.IEmployee this[String key]
{
get { return this.employees[key]; }
set { this.employees[key] = value; }
}
public EmployeeFactoryClient(Interfaces.IEmployeeFactory factory)
{
this.factory = factory;
this.employees = new Dictionary<String, Interfaces.IEmployee>();
}
public void AddEmployee(Person person, Constants.EmployeeType type, DateTime hiredate, String key)
{
this.employees.Add(
new KeyValuePair<String, Interfaces.IEmployee>(
key,
this.factory.CreateEmployee(
person,
type,
hiredate
)
)
);
}
public void RemoveEmployee(String key)
{
this.employees.Remove(key);
}
public void ListAll()
{
foreach(var item in this.employees)
{
Console.WriteLine(
"Employee ID: " + item.Key.ToString() +
"; Details: " + item.Value.ToString()
);
}
}
}
class ApplicationShell
{
public static void Main()
{
var client = new EmployeeFactoryClient(new EmployeeFactory());
client.AddEmployee(
new Person {
FirstName = "Walter",
LastName = "Bishop",
Gender = BusinessObjects.Common.Constants.SexType.MALE,
Birthday = new DateTime()
},
BusinessObjects.Common.Constants.EmployeeType.MANAGER,
new DateTime(),
"A0001M"
);
Console.WriteLine(client["A0001M"].ToString());
Console.ReadLine();
}
}
Я хотел спросить о некоторых деталях архитектуры бизнес-логики.
Используя архитектуру, я не могу спроектировать, каким должен быть класс компании, не знаю, как мне интегрировать оно.
Я читал, что в таких случаях более целесообразно использовать ролевую архитектуру. Не могли бы вы привести пример (компания, сотрудники предприятия)?
Спасибо!