Провел обсуждение внутри команды.
1) Реализация на основе конструктора неудобна. Служба будет размещаться и использоваться IIS в качестве веб-ссылки. Невозможно попросить клиентские системы предоставить FactoryImplementatedObjects в вызове класса Разное.
2) Фабрики, основанные на сущностях, также не совсем точны. Если в моем проекте, скажем, есть 20 конкретных сущностей, таких как «Сотрудник», «Материал», «Проект», «Расположение», «Заказ»), то мне нужно иметь 20 фабрик. Также у класса «Разное» будет несколько пользовательских конструкторов для поддержки определенных вызовов контракта.
Я подготовил систему, которая работает, и DI достигнут на отличном уровне, но я чувствую, что я обманываю. Упс .. Не чувствую себя правильно в глубине души .. но нельзя опровергнуть, что я ошибался .. Пожалуйста, проверьте и позвольте мне знаю ваши комментарии.
Теперь у меня есть интерфейс IEntity, который является базой для всех других сущностей.
namespace BusinessModel.Interfaces
{
public interface IEntity
{
string EntityDescription { get; set; }
}
}
Следовательно, все будут реализовывать это.
namespace BusinessModel.Interfaces
{
public interface IEmployee : IEntity
{
string EmployeeId { get; set ; }
}
}
namespace BusinessModel.Interfaces
{
public interface IProject : IEntity
{
string ProjectId { get; set; }
}
}
и т. Д. (Интерфейс, реализующий интерфейс ... абсолютно нелепый, читерский, но работающий)
Далее объявляется, что тип Enum имеет список всех сущностей ...
namespace MiddleWare.Common
{
internal enum BusinessModel
{
IEmployee,
IProject
}
}
Создается класс DI Helper, который отныне будет рассматриваться как часть бизнес-модели, и любые изменения в нем (Внедрение, Именование ...) будут восприниматься как бизнес-сдвиг. Так что если класс DIHelper должен стать DIHelper2, то это как БОЛЬШОЙ (можно ли этого избежать ??)
namespace MiddleWare.Common
{
internal sealed class DIHelper
{
internal static IEntity GetRequiredIEntityBasedObject(BusinessModel BusinessModelObject)
{
switch (BusinessModelObject)
{
case BusinessModel.IEmployee:
return new Employee();
}
return null;
}
}
}
Функция самообъяснительная ...
Итак, наконец, контракт и реализация ...
namespace MiddleWare.ServiceContracts
{
[ServiceContract(Namespace = "http://mywebsite.com/MyProject")]
public interface IMiscellaneous
{
[OperationContract]
[ServiceKnownType(typeof(MiddleWare.Classes.Employee))]
IEnumerable<IEmployee> Search_Employee
(string SearchText);
}
}
namespace MiddleWare.ServiceClasses
{
public class Miscellaneous : IMiscellaneous
{
public IEnumerable<IEmployee> Search_Employee
(string SearchText)
{
List<IEmployee> IEmployeeList = new List<IEmployee>();
IEmployee TempObject = (IEmployee)DIHelper.GetRequiredIEntityBasedObject(MiddleWare.Common.BusinessModel.IEmployee);
TempObject.EmployeeId = "12345678";
IEmployeeList.Add(TempObject);
return IEmployeeList;
}
}
}
Что ты скажешь ??
Моя команда счастлива, хотя:)