Программирование >>  Дополнения add-ins 

1 2 3 [ 4 ] 5 6 7


перечислены сборки, ссылки на которые понадобятся. Со ссылками на другие проекты внутри решения вам понадобится установить свойство 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, наследуя реализацию ин-



1 2 3 [ 4 ] 5 6 7

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика