2013-07-11 95 views
0

我在工作時爲內部應用程序製作了一個用戶不活動記錄器,並且當我嘗試調用將消息寫入數據庫的方法時,將消耗的消息寫入MySQL數據庫時出現問題,它會引發錯誤:'AccessEye.LogData'是一個'類型',在給定的上下文中無效爲什麼我不能調用我的WriteLogDataToDb方法?

任何和所有的幫助,將不勝感激,這是一個窗口項目與頂部服務被用作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; 
using System.ComponentModel; 

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

     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(); 
      } 
     } 

     public static string GetEnumDescriptionAttributeValue(Enum value) 
     { 
      var fieldInfo = value.GetType().GetField(value.ToString()); 
      var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 
      return attributes.Length > 0 ? attributes[0].Description : value.ToString(); 
     } 

     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(AccessEye.LogData); 

       //AppForm.WriteLogDataToDb(data); 
       //Console.WriteLine(msg.Body.UserName + " -- " + msg.Body.ComputerName + " -- " + msg.Body.EventType + " -- " + msg.Body.TeamviewerId); 
      })); 

      return true;  
     } 

     public bool Stop(HostControl hostControl) 
     { 
      Logger.Trace("STOP"); 
      Program.bus.Dispose(); 
      return true; 
     } 

     public void Shutdown(HostControl hostControl) 
     { 
      Logger.Trace("SHUTDOWN"); 
      Program.bus.Dispose(); 

     } 
    } 
} 

回答

0

你傳遞一個Type作爲參數傳遞給WriteLogDataToDb()實現方法具d,當它預期爲AccessEye.LogData的一個實例時。

我不知道你想在哪裏初始化你的變量,但要「修復」(你正在初始化一個默認實例和我的建議代碼)你的問題可能你必須改變這段代碼。

Program.bus.Subscribe<AccessEye.LogData>(queue, 
     (msg, messageRecInfo) => Task.Factory.StartNew(() => 
     { 
      WriteLogDataToDb(new AccessEye.LogData()); 
     })); 

請注意,我不知道構造函數用於AccessEye.LogData類型定義了什麼,但你可能知道。

另一方面,我想lambda表達式的參數之一是所需類型的一個實例。

什麼是Suscribe()方法是AccessEye.LogData

編輯

由於OP說,在他的評論中,解決方案是使用此代碼段替換原來的代碼:

Program.bus.Subscribe<AccessEye.LogData>(queue, 
    (msg, messageRecInfo) => Task.Factory.StartNew(() => 
    { 
     var data2 = LogDataFactory.CollectData(); 
     data2.EventType = AccessEye.UserStateEvents.Logon; 
     WriteLogDataToDb(data2); 
    })); 
+0

那麼我該如何解決?對不起,我是一個初學者在c# –

+0

沒關係,我以不同的方式解決了這個問題,謝謝你的答案幫助=] –

+0

雖然接受我的答案對我有利(謝謝!),如果你採取的解決方案是不同的,我認爲你最好用你的問題的最佳解決方案來回答你自己的問題。這樣做,你可以幫助任何在將來檢查這個問題的人。 – HuorSwords

0

這似乎是你的行動是不正確,你想要什麼寫入數據庫的消息是正文的消息,而不是類型的的消息;

Program.bus.Subscribe<AccessEye.LogData>(queue, (msg, messageRecInfo) => 
    Task.Factory.StartNew(() => 
     { 
      WriteLogDataToDb(msg.Body); 
     })); 
相關問題