1

サービス内の別のクラスからメソッドを呼び出そうとしていますが、呼び出そうとしているメソッドが存在しないため、可能であれば助けてほしいとのことです。

プログラムは作業プロジェクトであり、人々が電話に出ないという問題があったため、ユーザーの非アクティブを記録します。コードは以下のとおりです。これは、rabbitMQ からのメッセージを消費するトップシェルフ サービスであり、メッセージを消費して転送したいデータベースへ =]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using NLog;
using IWshRuntimeLibrary;
using Topshelf;
using System.Data.Odbc;
using EasyNetQ;
using RabbitMQ;
using EasyNetQ.Topology;
using System.Threading.Tasks;
using System.Windows.Forms;
using AccessEye;

namespace LogService
{

    public class WindowsServiceHost : ServiceControl, ServiceShutdown
    {
        public static readonly Logger Logger = LogManager.GetCurrentClassLogger();


        public bool Start(HostControl hostControl)
        {

            Program.bus = RabbitHutch.CreateBus("host=as01.access.local;virtualHost=DEV-Reece;username=reece;password=reece").Advanced;

            //var bus = RabbitHutch.CreateBus("host=as01.access.local;virtualHost=DEV-Reece;username=reece;password=reece").Advanced;
            var queue = Queue.Declare(true, false, true, null);
            var exchange = Exchange.DeclareFanout("UserActivityFanout", true, false, null);
            var exchangeTopic = Exchange.DeclareTopic("UserActivity", true, false, null);
            queue.BindTo(exchange, "#");
            exchange.BindTo(exchangeTopic, "#");
            Program.bus.Subscribe<AccessEye.LogData>(queue, (msg, messageRecInfo) => Task.Factory.StartNew(() =>
            {
                WriteLogDataToDb();
                Console.WriteLine(msg.Body.UserName + " -- " + msg.Body.ComputerName + " -- " + msg.Body.EventType + " -- " + msg.Body.TeamviewerId);
            }));

            return true;

        }

そして、これは私が呼び出そうとしているメソッドです

 public partial class AppForm : Form
    {

        public static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private Screensaver watcher;
        public Inactivity inactivity;
        IAdvancedBus bus;
        IExchange exchange;

    public void WriteLogDataToDb(LogData data)
            {
                using (var db = new LogService.UserActivityDataContext())
                {
                    DbLogData logData = AutoMapper.Mapper.Map<LogData, DbLogData>(data);

                    int t = (int)data.EventType;

                    EventType eventType = db.EventTypes.FirstOrDefault(r => r.Id == t);

                    if (eventType == null)
                    {
                        eventType = db.EventTypes.Add(new EventType
                        {
                            Event = GetEnumDescriptionAttributeValue(data.EventType),
                            Id = (int)data.EventType
                        });
                        db.SaveChanges();
                    }
                    logData.EventTypeId = eventType.Id;
                    db.LogEvents.Add(logData);

                    db.SaveChanges();
                    }

    }
4

1 に答える 1

2

WriteLogDataToDb()が宣言されたクラスが呼び出された場合、ClassA2 つのことを行います。メソッドstaticを作成すると、実際にLogDataデータを渡す必要があります。

public class AppForm
{
    public static void WriteLogDataToDb(LogData data)
    {
        using (var db = new LogService.UserActivityDataContext())
        {
            DbLogData logData = AutoMapper.Mapper.Map<LogData, DbLogData>(data);

            int t = (int)data.EventType;

            EventType eventType = db.EventTypes.FirstOrDefault(r => r.Id == t);

            if (eventType == null)
            {
                eventType = db.EventTypes.Add(new EventType
                {
                    Event = GetEnumDescriptionAttributeValue(data.EventType),
                    Id = (int)data.EventType
                });
                db.SaveChanges();
            }
            logData.EventTypeId = eventType.Id;
            db.LogEvents.Add(logData);

            db.SaveChanges();
        }
    }
}

次に、Startコードで呼び出す必要がありますAppForm.WriteLogDataToDb(data)

編集:

これらのクラスは 2 つの異なるプロジェクトにあるため、参照を追加してWindowsServiceHostを使用できるようにする必要がありますAppForm。これをする:

  1. を含むプロジェクトを右クリック > [プロパティ] をクリックしますAppForm。[アプリケーション] タブで、Assembly name:
  2. WindowsServiceHostの参照項目を右クリックして、Add reference
  3. Projectsタブに移動
  4. Assembly name:手順 1 でメモしたものを追加します
  5. 右クリックAppFormWindowsSerivceHostResolve、using ステートメントを追加します。
于 2013-07-11T15:34:29.180 に答える