|
Программирование >> Дополнения add-ins
терфейса IContract по умолчанию, и реализует интерфейс контракта. На этот раз интерфейс ICalculatorContract реализован методами GetOperations() и Operate(). Метод Operate() адаптера вызывает метод Operate() класса представления Calculator, где IOperationContract должен быть преобразован в Operation. Это делается вспомогательным статическим методом ContractToViewAdapter(), определенным в классе OperationViewToContractAddInAdapter. Реализация метода GetOperations нуждается в преобразовании коллекции IListContract<IOperationContract> в IList<Operation>. Для таких преобразований коллекции класс CollectionAdapters определяет методы преобразования ToIList() и ToIListContract(). Здесь для преобразования используется метод ToIListContract(). Атрибут AddInAdapter идентифицирует класс как адаптер стороны дополнения. using System.AddIn.Contract; using System.AddIn.Pipeline; namespace Wrox.ProCSharp.AddIns [AddInAdapter] internal class CalculatorViewToContractAddInAdapter : ContractBase, ICalculatorContract private Calculator view; public CalculatorViewToContractAddInAdapter(Calculator view) { this.view = view; public IListContract<IOperationContract> GetOperations() { return CollectionAdapters.ToIListContract<Operation, IOperationContract> (view.GetOperations(), OperationViewToContractAddInAdapter.ViewToContractAdapter, OperationViewToContractAddInAdapter.ContractToViewAdapter); public double Operate(IOperationContract operation, double[] operands) return view.Operate( OperationViewToContractAddInAdapter.ContractToViewAdapter( operation), operands); Поскольку классы адаптеров вызываются системой рефлексии .NET, с этими классами можно использовать модификатор доступа internal. Поскольку эти классы - деталь реализации, применять его будет хорошей идеей. Дополнение калькулятора Дополнение реализовано классом CalculatorV1. Сборка дополнения имеет зависимость от сборки представления дополнения, поскольку это необходимо для реализации абстрактного класса Calculator. Атрибут AddIn помечает класс как дополнение для хранилища дополнений, и добавляет информацию об издателе, версии и описание. На стороне хоста эта информация доступна из AddInToken. CalculatorV1 возвращает список поддерживаемгх операций в методе GetOperations(). Метод Operate() вычисляет операнды в зависимости от операции. using System; using System.AddIn; using System.Collections.Generic; namespace Wrox.ProCSharp.AddIns [AddIn( CalculatorAddIn , Publisher= Wrox Press , Version= 1.0.0.0 , Description= Sample AddIn )] public class CalculatorV1 : Calculator { private List<Operation> operations; public CalculatorV1() operations = new List < Operation > (); operations.Add(new Operation() { Name = + , NumberOperands = 2 }), operations.Add(new Operation() { Name = - , NumberOperands = 2 }) operations.Add(new Operation() { Name = / , NumberOperands = 2 }) operations.Add(new Operation() { Name = * , NumberOperands = 2 }) public override IList<Operation> GetOperations() { return operations; public override double Operate(Operation operation, double[] operand) { switch (operation.Name) case + : return operand[0] + operand[1]; case - : return operand[0] - operand[1]; case / : return operand[0] / operand[1]; case * : return operand[0] * operand[1]; default: throw new InvalidOperationException( String.Format( invalid operation {0} , operation.Name)); Представление хоста калькулятора Продолжим рассмотрение и обратимся к представлению хоста на стороне хоста. Подобно представлению дополнения, представление хоста определяет абстрактный класс с методами, подобными контракту. Однако методы, определенные здесь, вызываются приложением хоста. Оба класса - Calculator и Operation - являются абстрактными, а их члены реализованы адаптером хоста. Классы здесь должны реализовать интерфейс, чтобы их могло использовать хост-приложение. using System.Collections.Generic; namespace Wrox.ProCSharp.AddIns public abstract class Calculator public abstract IList<Operation> GetOperations(); public abstract double Operate(Operation operation, params double[] operand); public abstract class Operation public abstract string Name { get; } public abstract int NumberOperands { get; } Адаптер хоста калькулятора Сборка адаптера хоста ссылается на представление хоста и контракт для отображения представления контракта. Класс OperationContractToViewHostAdapter реализует члены абстрактного класса Operation. Класс CalculatorContractToViewHostAdapter реализует члены абстрактного класса Calculator. В OperationContractToViewHostAdapter ссылка на контракт присваивается в конструкторе. Класс адаптера также содержит экземпляр ContractHandle, который добавляет ссылку времени жизни на contract, так что дополнение остается загруженным до тех пор, пока в нем нуждается принимающее хост-приложение. using System.AddIn.Pipeline; namespace Wrox.ProCSharp.AddIns internal class OperationContractToViewHostAdapter : Operation private ContractHandle handle; public IOperationContract Contract { get; private set; } public OperationContractToViewHostAdapter(IOperationContract contract) this.Contract = contract; handle = new ContractHandle(contract); public override string Name return Contract.Name; public override int NumberOperands return Contract.NumberOperands; internal static class OperationHostAdapters internal static IOperationContract ViewToContractAdapter(Operation view) return ((OperationContractToViewHostAdapter)view).Contract; internal static Operation ContractToViewAdapter( IOperationContract contract) return new OperationContractToViewHostAdapter(contract);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |