Создание пользовательского интерфейса для контроля и взаимодействия с рабочим сервисом окон

Хорошо, вот моя лучшая псевдо математика:

уравнение для Вашей строки:

Y = + основной обмен

, Где:

b = (сумма (x*y) - сумма (x) сумма (y)/n) / (сумма (x^2) - сумма (x) ^2/n)

= сумма (y)/n - b (сумма (x)/n)

, Где сумма (xy) является суммой всего x*y, и т.д. Не особенно ясного, который я признаю, но лучше, чтобы я мог обойтись без символа сигмы:)

... и теперь с добавленной Сигмой

b = (Σ (xy) - (Σ xΣ y)/n) / (Σ (x^2) - (Σ x) ^2/n)

= (Σ y)/n - b ((Σ x)/n)

, Где Σ (xy) является суммой всего x*y и т.д., и n является числом очков

14
задан Nathan Ridley 21 November 2009 в 10:29
поделиться

2 ответа

Не используйте удаленное взаимодействие! Хотя это, безусловно, будет работать, Microsoft заявляет, что удаленное взаимодействие является устаревшей технологией и что все новые распределенные приложения должны разрабатываться с использованием WCF. Подробнее см. здесь .

Windows Communication Foundation (WCF) - это рекомендуемый способ взаимодействия двух процессов .NET между собой. WCF предоставляет унифицированную модель программирования, которая значительно упрощает распределенную разработку за счет абстрагирования многих сложностей, связанных с конкретными механизмами связи, например, сокетами, каналами и т. Д.

Учитывая детали вашей ситуации, я бы предложил сделать каждый плагин службы Windows Сервис WCF. Для каждой службы WCF, т. Е. Плагина, определите интерфейс, который он должен предоставить вашему пользовательскому интерфейсу. Интерфейс - это просто интерфейс C #, украшенный атрибутом ServiceContract . Этот интерфейс содержит методы, каждый из которых украшен атрибутом OperationContract , который ваш пользовательский интерфейс будет использовать для связи со службой (плагином) WCF. Эти методы могут принимать и возвращать любой сериализуемый тип .NET или, как это часто бывает, ваши собственные настраиваемые типы. Чтобы использовать настраиваемые типы с WCF, просто украсьте их атрибутом DataContract и отметьте элементы, которыми вы хотите обмениваться через WCF, атрибутом DataMember .

После того, как вы получите свой Определен интерфейс ServiceContract , определяется класс, реализующий этот интерфейс. Каждый метод OperationContract делает все, что ему нужно, например, взаимодействует с базой данных, вычисляет какое-то значение и т. Д. Сделав это, вы фактически определили службу WCF. Вот небольшой, но работающий пример:

using System.ServiceModel;
namespace AdditionServiceNamespace
{
    [DataContract]
    public class Complex
    {
        [DataMember]
        public int real;
        [DataMember]
        public int imag;
    }
    [ServiceContract]
    public interface IAdditionService
    {
        [OperationContract]
        Complex Add(Complex c1, Complex c2);
    }
    public class AdditionService : IAdditionService
    {
        public Complex Add(Complex c1, Complex c2)
        {
            Complex result = new Complex();
            result.real = c1.real + c2.real;
            result.imag = c1.imag + c2.imag;
            return result;
        }
    }
}

Следующим шагом является размещение этой службы WCF, чтобы она была доступна для использования вашим пользовательским интерфейсом. Поскольку вы будете использовать службу Windows, размещение службы WCF выполняется достаточно легко с помощью функции обратного вызова OnStart () вашей службы Windows, например:

using System.ServiceModel;
using System.ServiceProcess;
using AdditionServiceNamespace;
namespace WindowsServiceNamespace
{
    public class WindowsService : ServiceBase
    {
        static void Main()
        {
            ServiceBase[] ServicesToRun = new ServiceBase[]
            { new WindowsService() };
            ServiceBase.Run(ServicesToRun);
        }
        private ServiceHost _host;
        public WindowsService()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            _host = new ServiceHost(typeof(AdditionService));
            _host.Open();
        }
        protected override void OnStop()
        {
            try
            {
                if (_host.State != CommunicationState.Closed)
                {
                    _host.Close();
                }
            }
            catch
            {
                // handle exception somehow...log to event viewer, for example
            }
        }
    }
}

Осталось только определить app.config для вашей службы Windows, который настроит определенные требуемые аспекты вашей службы WCF. Это может показаться излишним, но помните о двух вещах. Прежде всего, Visual Studio автоматически предоставляет вам базовый файл app.config, когда вы добавляете в проект класс службы WCF. Во-вторых, файл app.config дает вам огромный контроль над вашей службой WCF, не требуя изменения кода. Вот сопутствующий файл app.config для приведенного выше примера:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="AdditionServiceNamespace.MyAdditionService"
                     behaviorConfiguration="default">
                <endpoint name="AdditionService"
                     address="net.pipe://localhost/AdditionService"
                     binding="netNamedPipeBinding"
                     contract="AdditionServiceNamespace.IAdditionService" />
                <endpoint address="net.pipe://localhost/AdditionService/MEX"
                     binding="mexNamedPipeBinding"
                     contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="default">
                    <serviceMetadata />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Обратите внимание, что служба AdditionService WCF имеет две конечные точки. Конечная точка обмена метаданными используется клиентом для генерации кода, поэтому пока не обращайте на нее внимания. Первая конечная точка настроена на использование NetNamedPipeBinding . Это привязка , которую можно использовать, если ваш пользовательский интерфейс и служба Windows будут работать на одном компьютере (см. здесь , где представлена ​​блок-схема выбора соответствующей привязки для использования). Однако эту привязку нельзя использовать, если ваш пользовательский интерфейс и служба Windows будут работать на разных машинах. В этом случае вы можете использовать NetTcpBinding в качестве замены. Чтобы заменить NetTcpBinding на NetNamedPipeBinding, вам просто нужно изменить адрес и привязку конечной точки, например:

<endpoint name="AdditionService"
          address="net.tcp://<machine hostname here>/AdditionService"
          binding="netTcpBinding"
          contract="AdditionServiceNamespace.IAdditionService" />

Никаких изменений кода не требуется! Внесите изменения, перезапустите службу, и ваша служба WCF теперь доступна для удаленных компьютеров. Вы даже можете разрешить несколько конечных точек для одной и той же службы WCF, если хотите. Дело в том, что файл app.config предлагает огромную гибкость, не требуя изменения кода.

Вот и все! Теперь у вас есть служба WCF, размещенная внутри вашей службы Windows, доступная для использования вашим пользовательским интерфейсом.

Так как же работает сторона пользовательского интерфейса, то есть сторона клиента?

Именно здесь в игру вступает реальная мощь WCF . Приступая к работе с WCF, проще всего использовать возможности генерации кода Visual Studio. Убедитесь, что ваша служба Windows (та, на которой размещается AdditionService) запущена. В своем проекте пользовательского интерфейса щелкните правой кнопкой мыши проект в обозревателе решений и выберите Добавить ссылку на службу ... пункт меню. В поле Адрес введите net.pipe: // localhost / AdditionService и нажмите кнопку Перейти . Вы должны увидеть AdditionService в списке Services . В поле Пространство имен введите AdditionService и нажмите кнопку OK .

Выполнение этих шагов приведет к созданию прокси-сервера клиента и правильно определенного файла app.config которые добавляются в ваш проект пользовательского интерфейса. Этот клиентский прокси становится вашим клиентским API AdditionService, и вы используете его следующим образом:

using TestConsoleApp.AdditionService;
namespace TestConsoleApp
    class Program
    {
        static void Main(string[] args)
        {
            AdditionServiceClient client = new AdditionServiceClient();
            Complex c1 = new Complex(), c2 = new Complex();
            c1.real = 3; c1.imag = 5;
            c2.real = 1; c2.imag = 7;
            Complex result = client.Add(c1, c2);
        }
    }
}

Обратите внимание, насколько это просто. По сути, клиентский прокси, Создается экземпляр AdditionServiceClient . Затем создаются два объекта Complex . Наконец, вызывается метод Add () на прокси-сервере клиента, и возвращается результат Complex .

За кулисами происходит то, что Add () метод прокси-сервера клиента фактически передает два объекта Complex службе AdditionService WCF, размещенной в службе Windows. AdditionService выполняет добавление, а затем возвращает результат. Все это происходит через именованный канал, но обратите внимание, что здесь вообще нет кода, специфичного для именованного канала! WCF абстрагировала всю эту сложность за моделью программирования, которая определяется интерфейсом IAdditionService.

Я знаю, что нужно переварить много информации, но я надеюсь, что очевидно, насколько мощным и простым в использовании может быть WCF. Конечно, этот пример касается лишь небольшого подмножества всего, что доступно в WCF.

В конце концов, WCF должен быть механизмом, который вы используете для связи между вашим пользовательским интерфейсом и службой Windows. Для получения дополнительной информации я настоятельно рекомендую книгу Джувала Лоуи Программирование служб WCF для всего, что связано с WCF. Вы также можете посетить его веб-сайт IDesign.net , где можно найти бесплатные образцы кода WCF. Чтобы узнать больше о WCF, посмотрите это бесплатное видео на dnrTV. Он описывает назначение WCF и демонстрирует программирование WCF на нескольких простых для понимания примерах.

WCF должен быть механизмом, который вы используете для связи между вашим пользовательским интерфейсом и службой Windows. Для получения дополнительной информации я настоятельно рекомендую книгу Джувала Лоуи Программирование служб WCF для всего, что связано с WCF. Вы также можете посетить его веб-сайт IDesign.net , где можно найти бесплатные образцы кода WCF. Чтобы получить более подробную информацию о WCF, посмотрите это бесплатное видео на dnrTV. Он охватывает назначение WCF и демонстрирует программирование WCF на нескольких простых для понимания примерах.

WCF должен быть механизмом, который вы используете для связи между вашим пользовательским интерфейсом и службой Windows. Для получения дополнительной информации я настоятельно рекомендую книгу Джувала Лоуи Программирование служб WCF для всего, что связано с WCF. Вы также можете посетить его веб-сайт IDesign.net , где можно найти бесплатные образцы кода WCF. Чтобы узнать больше о WCF, посмотрите это бесплатное видео на dnrTV. Он описывает назначение WCF и демонстрирует программирование WCF на нескольких простых для понимания примерах.

посмотрите это бесплатное видео на dnrTV. Он охватывает назначение WCF и демонстрирует программирование WCF на нескольких простых для понимания примерах.

посмотрите это бесплатное видео на dnrTV. Он описывает назначение WCF и демонстрирует программирование WCF на нескольких простых для понимания примерах.

37
ответ дан 1 December 2019 в 07:19
поделиться

Your best bet is to use .NET remoting over an IPC channel.

While it seems complicated to setup, it is rather easy the second time around.

I suggest you play with a few samples first on exposing remotable objects from one application to another.

I have not used Message queues before, so I can't comment on that.

0
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: