2008-10-28 5 views
1

Я работаю над бизнес-приложением, которое разрабатывается с использованием философии DDD. Доступ к базе данных осуществляется через NHibernate, а уровень данных реализуется с использованием шаблона DAO.Доступ к нескольким поставщикам данных в слое данных

Диаграмма классов UML показана ниже.

UML Class Diagram http://img266.imageshack.us/my.php?image=classdiagramhk0.png http://img266.imageshack.us/my.php?image=classdiagramhk0.png

Я не знаю, дизайн хорош или нет. Как вы думаете?

Но проблема в том, что дизайн не хорош или нет. Проблема заключается в том, после запуска приложения IDaoFactory инстанциируются в слое представления и отправить в качестве параметра к классам презентаторов (который разработан с использованием MVC шаблона), как показано ниже

... 
IDaoFactory daoFactory = new NHibernateDaoFactory(); //instantiation in main class 
... 
SamplePresenterClass s = new SamplePresenterClass(daoFactory); 
... 

Использования только одного поставщика данных (который был только одна базы данных) было просто. Но теперь мы также должны получить данные из XML. И на следующих этапах разработки мы должны подключиться к различным веб-сервисам и управлять входящими и исходящими данными.

Данные из XML будут получены с использованием ключа, который является перечислением. Мы добавляем класс с именем XMLLoader к слою данных и добавляем к домену интерфейс ILoader. XMLLoader имеет метод, чью подпись

List<string> LoadData(LoaderEnum key) 

Если мы создаем ILoader с XMLLoader в презентации слое, как показано ниже, мы должны отправить его на объекты, которые собираются получить некоторые XML-данные из уровня данных.

ILoader loader = new XMLLoader(); 
SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader); 

После реализации классов доступа к веб-службы

SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader, sampleWebServiceConnector1, sampleWebServiceConnector2, ...); 

Параметры будет выращиваться во времени. Я думаю, что могу хранить все экземпляры объектов доступа к данным в классе и передавать их требуемым презентаторам (может быть, и синглетный шаблон может помочь). В области слоя должна быть класс, как это,

public class DataAccessHolder 
{ 
    private IDaoFactory daoFactory; 
    private ILoader loader; 
    ... 
    public IDaoFactory DaoFactory 
    { 
     get { return daoFactory; } 
     set { daoFactory = value; } 
    } 
    ... 
} 

В главном классе конкретизация может быть сделана с этой конструкцией следующего

DataAccessHolder dataAccessHolder = new DataAccessHolder(); 
dataAccessHolder.DaoFactory = new NHibernateDaoFactory(); 
dataAccessHolder.Loader = new XMLLoader(); 
... 
SamplePresenterClass s = new SamplePresenterClass(dataAccessHolder); 

Что вы думаете об этом проекте или вы можете предложить мне другой?

Спасибо всем repliers ...

+0

Ваш образ мертв. – Nix

ответ

1

ИМО, было бы чище использовать «глобальный» или статический daoFactory и сделать его универсальным.

DaoFactory<SamplePresenterClass>.Create(); // or 
DaoFactory<SamplePresenterClass>.Create(id); // etc 

Затем вы можете определить DaoFactory<T> брать только, скажем, IDao «s

interface IDao 
{ 
    IDaoProvider GetProvider(); 
} 

interface IDaoProvider 
{ 
    IDao Create(IDao instance); 
    void Update(IDao instance); 
    void Delete(IDao instance); 
} 

В принципе, вместо передачи конструкторе вашего DaoFactory, вы используете статический общий DaoFactory. Его T должен наследовать от IDao.Тогда DaoFactory класс может смотреть на поставщике T во время выполнения:

static class DaoFactory<T> where T : IDao, new() 
{ 
    static T Create() 
    { 
     T instance = new T(); 
     IDaoProvider provider = instance.GetProvider(); 

     return (T)provider.Create(instance); 
    } 
} 

Где IDaoProvier является общим интерфейсом, который вы можете реализовать, чтобы загрузить вещи, используя XML, NHibernate, веб-службы и т.д., в зависимости от класса. (Каждый объект IDao будет знать, как подключиться к его поставщику данных).

В целом, неплохой дизайн. Добавьте немного больше OO, и у вас будет неплохой дизайн. Например, каждый файл для XmlEnums может быть реализован как IDao «s

class Cat : IDao 
{ 
    IDaoProvider GetProvider() 
    { 
     return new XmlLoader(YourEnum.Cat); 
    } 

    // ... 
} 
+0

Я читал его снова и снова, но не могу его получить. Какова цель DaoFactory и GetProvider? Как я уже сказал, я должен использовать всех поставщиков. Некоторые данные будут записаны в базу данных, некоторые из них будут прочитаны из файлов XML и т. Д. – xelon

+0

Как показано на изображении, у IDao есть GetByID, Save и т. Д. Это не нужно в поставщиках XMLLoader или веб-сервисов. – xelon

+0

SamplePresenterClass - класс Presenter в шаблоне MVP. Он делегирует задания классу службы, а также отправляет экземпляр daoFactory в класс службы. Я до сих пор не могу получить эти DaoFactory .Create(); // или DaoFactory .Create (id); // и т.д – xelon