如何为我的VSTO插件应用3层架构?

所以我很高兴在我的API上使用3层体系结构,但是在将其实现到VSTO AddIn时遇到了问题(但也许我不应该?)。无论如何,这是我无法使用的解决方案;

我的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>();
    }
}

这是我的DAL:

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之外,其他任何地方都无法使用我的工作簿。因此,我应该只在一个大项目中创建它,而忘记分层吗?如何从VSTO之外的任何地方访问我的数据(Excel工作表)?

slxxfl0000 回答:如何为我的VSTO插件应用3层架构?

问题在于VSTO实际上是一个插件框架。在插件框架内部使用三层体系结构充其量会感觉很尴尬,这将需要丢弃大量框架并自行滚动。

因此,例如,您的DAL不应返回工作表,而应滚动自己的DTO,以提取所需的位并将其传递到链中。我将传递从UI层调用DAL所需的对象(理想情况下,该对象位于IoC容器中,但这同样有效)。

这将需要编写大量代码,但是您的业务和UI层将在很大程度上与较低层分离。就个人而言,我要么看一下您是否可以利用或发布自己的IoC(可以从VSTO层调用)。可以将工作簿传递到DAL的构造函数中的东西。

这是很多可以将您的经理与excel隔离开来的管道,它可能值得也可能不值得。这取决于您的业务逻辑的最终复杂性以及您需要的可测试性。插件通常不需要与它们插入的对象隔离...

本文链接:https://www.f2er.com/3124345.html

大家都在问