|
Программирование >> Дополнения add-ins
перечислены сборки, ссылки на которые понадобятся. Со ссылками на другие проекты внутри решения вам понадобится установить свойство Copy Local в False, чтобы сборки не копировались. Исключением является консольный проект HostApp, которому нужна ссылка на проект HostView. Эта сборка должна быть скопирована, чтобы ее можно было найти из хост-приложения. Также вам нужно будет изменить выходной путь сгенерированных сборок, чтобы сборки копировались в правильные каталоги канала. Таблица 36.8. Описание решения Проект CalcView CalcAddIn CalcAddInAdapter HostView HostAdapter HostApp Ссылки CalcContract System.AddIn System.AddIn CalcView System.AddIn System.AddIn.Contract CalcView CalcContract System.AddIn System.AddIn.Contract HostView CalcContract System.AddIn HostView Выходной путь System.AddIn.Contract ..\Pipeline\ Contracts\ ..\Pipeline\ AddInViews\ ..\Pipeline\AddIns\ CalcAddIn\ ..\Pipeline\ AddInSideAdapters\ ..\Pipeline\ HostSideAdapters\ Описание Эта сборка содержит контракт для взаимодействия с дополнением. Контракт определен интерфейсом. Сборка CalcView содержит абстрактный класс, на который ссылается дополнение. Это сторона контракта, относящаяся к дополнению. CalcAddIn - проект дополнения, ссылающийся на сборку представления дополнения. Эта сборка содержит реализацию дополнения. CalcAddInAdapter соединяет представление дополнения и сборку контракта, и отображает контракт на представление дополнения. Сборка, содержащая абстрактный класс представления хоста, не нуждается в ссылке на любую сборку дополнения, и а также не имеет ссылок на другой проект в решении Адаптер хоста отображает представление хоста на контракт. Таким образом, нуждается в ссылках на оба эти проекта. Принимающее хост-приложение, активизирующее дополнение. Контракт калькулятора Начнем с реализации сборки контракта. Сборки контракта содержат интерфейс контракта, определяющий протокол для коммуникаций между хостом и дополнением. В следующем коде вы можете видеть контракт, определенный для примера приложения - калькулятора. Приложение определяет контракт с методами GetOperations() и Operate() . Метод GetOperations() возвращает список математических операций, поддерживаемых дополнением калькулятора. Операция определена интерфейсом IOperationContract, представляющим собой контракт. IOperationContract определяет доступные только для чтения свойства Name и NumberOperands. Метод Operate() вызывает операцию из дополнения и требует операции, определенной интерфейсом IOperation и операндов в массиве double. С таким контрактом возможна поддержка дополнением любых операций, принимающих любое количество операндов double и возвращающих значение double. Атрибут AddInContract используется AddInStore для построения кэша. Атрибут AddInContract помечает класс как интерфейс контракта дополнения. using System.AddIn.Contract; using System.AddIn.Pipeline; namespace Wrox.ProCSharp.AddIns [AddInContract] public interface ICalculatorContract : IContract { IListContract<IOperationContract> GetOperations(); double Operate(IOperationContract operation, double[] operands); public interface IOperationContract : IContract { string Name { get; } int NumberOperands { get; } Представление дополнения калькулятора Представление дополнения переопределяет контракт, как он выглядит для дополнения. Этот контракт определен интерфейсами ICalculatorContract и IOperationContract. Для этого представление дополнения определяет абстрактный класс Calculator и конкретный класс Operation. Для Operation не существует определенной реализации, которая требовалась бы каждому дополнению. Вместо этого класс уже реализован в сборке представления дополнения. Этот класс описывает операцию математических вычислений со свойствами Name и NumberOperands. Абстрактный класс Calculator определяет методы, которые должны быть реализованы дополнениями. В то время как контракт определяет типы параметров и возврата, которые должны передаваться через границы доменов приложений и процессов, это не касается представления дополнения. Здесь вы можете использовать типы, которые облегчают написание дополнений разработчику. Метод GetOperations() возвращает IList<Operation> вместо IListOperation<IOperationContract>, как вы уже видели в сборке контракта. Атрибут AddInBase идентифицирует класс как представление дополнения для хранения. using System.AddIn.Pipeline; using System.Collections.Generic; namespace Wrox.ProCSharp.AddIns [AddInBase] public abstract class Calculator { public abstract IList<Operation> GetOperations(); public abstract double Operate(Operation operation, double[] operand); public class Operation public string Name { get; set; } public int NumberOperands { get; set; } Адаптер дополнения калькулятора Адаптер дополнения отображает контракт на представление дополнения. Эта сборка имеет ссылки как на сборку контракта, так и на сборку представления дополнения. Реализация адаптера требует отображения метода IListContract< IOperationContract> GetOperations() на метод представления IList<Operation> GetOperations() . Сборка включает классы OperationViewToContractAddInAdapter и Calculator ViewToContractAddInAdapter. Эти классы реализуют интерфейсы IOperationContract и ICalculatorContract. Методы базового интерфейса IContract могут быть реализованы порождением от базового класса ContractBase. Этот класс предоставляет реализацию по умолчанию. OperationViewToContractAddInAdapter реализует другие члены интерфейса IOperationContract и просто переадресует вызовы к представлению Operation, присвоенному в конструкторе. Класс OperationViewToContractAddInAdapter также содержит статические вспомогательные методы ViewToContractAdapter() и ContractToViewAdapter() , отображающие Operation на IOperationContract и наоборот. using System.AddIn.Pipeline; namespace Wrox.ProCSharp.AddIns internal class OperationViewToContractAddInAdapter : ContractBase, IOperationContract private Operation view; public OperationViewToContractAddInAdapter(Operation view) this.view = view; public string Name get { return view.Name; } public int NumberOperands get { return view.NumberOperands; } public static IOperationContract ViewToContractAdapter(Operation view) return new OperationViewToContractAddInAdapter(view); public static Operation ContractToViewAdapter( IOperationContract contract) return (contract as OperationViewToContractAddInAdapter).view; Класс CalculatorViewToContractAddInAdapter очень похож на OperationViewT oContractAddInAdapter: он происходит от ContractBase, наследуя реализацию ин-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |