C# 如何将3层体系结构应用于我的VSTO插件?

C# 如何将3层体系结构应用于我的VSTO插件?,c#,excel,architecture,vsto,3-tier,C#,Excel,Architecture,Vsto,3 Tier,所以我很乐意在我的API中使用3层架构,但在我的VSTO插件中实现它时遇到了问题,但也许我不应该?。无论如何,这是我的非工作解决方案 我的VSI需要有一个按钮来接收所有对象 private void Bt1_Click(object sender, Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs e) { ObjectManager objManager = new ObjectManager(new ExcelO

所以我很乐意在我的API中使用3层架构,但在我的VSTO插件中实现它时遇到了问题,但也许我不应该?。无论如何,这是我的非工作解决方案

我的VSI需要有一个按钮来接收所有对象

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

我的问题是,除了我的VSTO,我的工作簿在任何地方都不可用。因此,我是否应该在一个大项目中创建它,而忘记分层,或者如何从VSTO以外的任何地方访问我的Excel数据表?

问题在于VSTO实际上是一个插件框架。在插件框架内使用三层架构充其量也会让人感到尴尬,这样做需要抛弃大量的框架,并使用自己的框架

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

这将需要编写相当多的代码,但您的业务和UI层将在很大程度上与较低级别分离。就个人而言,我想看看你是否可以利用或推出你自己的IoC,它可以从VSTO层调用。可以将工作簿传递到DAL的构造函数中的内容


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

评论所述问题:如何从VSTO以外的任何地方访问我的Excel数据表?我不知道你这个问题是什么意思。也不清楚这是VSTO附加模块还是文档级自定义。但在任何情况下,如果您只需要数据,而不需要用户交互,请使用OLEDB连接到关闭的工作簿。当然,如果工作簿已打开,请通过传递VSTO部分使用互操作。非常感谢您的回复。我想保持它3层,因为我已经开始,我有一个最后期限即将到来。是否可以从我的DAL返回一个Excel范围,其中只包含选定的对象单元格?然后我的DAL looksl方法是:Xcl.Range GetObjectByNamestring name;我的UI的BLL方法是:Object GetObjectByNamestring name;所以我要做的是,我的BLL接收一个Excel范围,执行一些魔术,并返回一个从Excel范围填充的对象类实例。据我所知,我应该从DAL中的Excel工作表中检索我的对象,然后返回对象?不,你根本不应该返回对象,您应该从对象返回UI层所需的内容。这就是脱钩的方式。尽管我再次质疑什么是有效的excel插件中与excel脱钩的价值。
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;
    }
}