Как применить трехуровневую архитектуру для моей надстройки VSTO?

Поэтому я рад использовать трехуровневую архитектуру для своих API, но у меня есть проблема с ее реализацией в моей надстройке VSTO (но, может быть, мне не следует?). В любом случае, вот мое нерабочее решение;

В моем VSTO есть кнопка для получения всех объектов.

private void Bt1_Click(object sender, Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs e)
    {
        ObjectManager objManager = new ObjectManager(new ExcelObjectDal());
        var allObjects = objManager.GetObjects();
        //Add all objects to WinForm
    }

и мой ObjectManager, расположенный на моем бизнес-уровне:

public class ObjectManager : IObjectService
{
    public IObjectDal ObjectDal { get; set; }
    public ObjectManager(IObjectDal DAL)
    {
        ObjectDal = DAL;
    }

    public List<Object> GetObjects()
    {
        Worksheet sheet = ObjectDal.GetObjects();
        //Business logic to extract each object from the sheet
        return new List<object>();
    }
}

а вот мой ДАЛ:

public class ExcelObjectDal : IObjectDal
{
    private Workbook book;
    public ExcelObjectDal()
    {
        this.book = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook);
    }
    public Worksheet GetObjects()
    {
        Worksheet sheet = (Worksheet)Globals.Factory.GetVstoObject(book.Worksheets[name]);
        return sheet;
    }
}

Моя проблема в том, что моя книга недоступна нигде, кроме моего VSTO. Так должен ли я просто создать его в одном большом проекте и забыть о многоуровневости или как получить доступ к своим данным (таблицам Excel) из любого места, кроме VSTO?


person newClassSameConcept    schedule 11.11.2019    source источник
comment
Комментируя заданный вопрос: Как мне получить доступ к своим данным (таблицам Excel) из любого места, кроме VSTO? Я не уверен, что вы имеете в виду этот вопрос. Неясно также, является ли это надстройкой VSTO или настройкой на уровне документа. Но в любом случае, если вам нужны только данные без взаимодействия с пользователем, используйте соединение OLEDB с закрытой книгой. Если рабочая книга открыта, используйте взаимодействие, минуя часть VSTO.   -  person Cindy Meister    schedule 11.11.2019


Ответы (1)


Проблема в том, что VSTO фактически является фреймворком плагинов. Использование трехуровневой архитектуры внутри фреймворка плагинов будет в лучшем случае неудобным, для этого потребуется отказаться от большого количества фреймворка и создать свой собственный.

Так, например, ваш DAL не должен возвращать рабочие листы, вместо этого вы должны свернуть свой собственный DTO, который извлекает нужные вам биты и передает их вверх по цепочке. Я бы передал объект, необходимый для вызова DAL из уровня пользовательского интерфейса (в идеале он находится в контейнере IoC, но это тоже работает).

Это потребует написания довольно большого количества кода, но ваш бизнес-уровень и уровень пользовательского интерфейса будут в значительной степени отделены от более низких уровней. Лично я бы либо посмотрел, можете ли вы использовать или свернуть свой собственный IoC, который можно вызывать из уровня VSTO. Что-то, что может передать книгу в конструктор для DAL.

Это МНОГО сантехники, чтобы изолировать вашего менеджера от Excel, оно может того стоит, а может и не стоит. Это зависит от конечной сложности вашей бизнес-логики и от того, насколько она вам нужна для проверки. Обычно плагины не нужно изолировать от объектов, к которым они подключаются...

person Rob Conklin    schedule 11.11.2019
comment
Большое спасибо за ваш ответ. Я бы хотел, чтобы это было трехуровневым, так как я уже начал, и у меня очень скоро приближается крайний срок. Можно ли вернуть диапазон Excel из моего DAL только с выбранными ячейками объектов? Тогда мой метод lookl DAL: Xcl.Range GetObjectByName(имя строки); и мой метод BLL для моего пользовательского интерфейса: Object GetObjectByName (имя строки); Итак, что я делаю, так это то, что мой BLL получает диапазон Excel, делает некоторую магию и возвращает экземпляр моего класса Object, заполненный из диапазона Excel. - person newClassSameConcept; 12.11.2019
comment
Как я вас понимаю, я должен получить свой объект из листа Excel в DAL и вместо этого вернуть объект? - person newClassSameConcept; 12.11.2019
comment
Нет, вы вообще не должны возвращать объект, вы должны возвращать то, что нужно слою пользовательского интерфейса от объекта. Вот так и разъединяешься. - person Rob Conklin; 12.11.2019
comment
Хотя еще раз, я сомневаюсь в ценности отделения от Excel в том, что фактически является плагином Excel. - person Rob Conklin; 12.11.2019