Я хотел бы сделать интерфейсы из ваших классов слоев. Это удаляет статические классы, как желаемые, и устанавливает вас для инъекций. Для вашего примера, который является довольно небольшим, я бы не стал советоваться с проблемой, если только в качестве учебного опыта. Нет жестких правил, когда использовать эту инъекцию, но шаблон очень помогает, когда происходит тестирование устройства.
Никто никогда не говорил: «Ого! Было бы намного проще написать единичный тест, если бы это был статический метод или синглтон!»
В конце вы получите что-то вдоль линий интерфейса для функциональности, которую вы хотите ввести. Это предполагает, что некоторый уровень модели домена будет существовать, и исходные данные из базы данных будут преобразованы в модель.
Вы должны начать с определения интерфейса, который вы должны ввести в зависимые классы.
public interface IBusinessLayer
{
Data GetData();
}
public interface IDataAccessLayer
{
Data GetData();
}
public interface IDatabase
{
DbData GetDatabaseData();
}
Основная цель состоит в том, чтобы контейнер ввел функциональность, чтобы завершить выполняемые операции. В этом, получая данные. Предполагая, что данные являются классом в модели домена.
public class ServiceLayer
{
IBusinessLayer business = null;
public ServiceLayer(IBusinessLayer business)
{
this.business = business;
}
public void GetData()
{
Data data = business.GetData();
// do something with data
}
}
Вы можете повторить один и тот же шаблон для разных слоев. Хотя это кажется большой работой для простого приложения, жесткий край, данный интерфейсами, позволяет каждому слою эволюционировать на собственном ... до тех пор, пока остается договор с интерфейсом.
Сегрегация хорошая, если вы четко определяете слои. Например, не позволяя необработанным данным базы данных, рядам и т. Д. Выводиться в верхние слои.
общественный класс BusinessLayer: IBusinessLayer { IDataAccessLayer dataAccess = null;
// container will inject data access layer
public BusinessLayer(IDataAccessLayer dataAccess)
{
this.dataAccess = dataAccess;
}
public Data GetData()
{
Data data = dataAccess.GetData();
// do something with data?
return data;
}
}
// Retruns typed data business layer
public class DataAccessLayer : IDataAccessLayer
{
IDatabase db = null;
public DataAccessLayer(IDatabase db)
{
this.db = db;
}
public Data GetData()
{
var db_data = db.GetDatabaseData();
Data data = /*convert raw db_data -> type domain data*/
return data;
}
}
Предпосылка вопроса не представляется актуальной. Это не статические классы против контейнера IoC, так как вам не нужен контейнер IoC для инъекции зависимостей. –
Imho это больше зависит от того, как и что делает ваша компания. И как быстро они меняют направление развития). Есть случаи, когда IoC можно использовать для очень простых сценариев, есть также случаи, когда IoC не является вариантом вообще. –
Этот вопрос кажется довольно широким и, вероятно, закрыт. Вы не должны заботиться о контейнерах, а о вашем фактическом дизайне классов. С 'static' вы обычно указываете« материал, который существует независимо от фактического экземпляра класса. Однако я предполагаю, что бизнес-уровень имеет отношение 1: 1 к уровню доступа к данным, не так ли? Так что makie thjis все экземпляры, и вы сделали. – HimBromBeere