2013-07-11 2 views
0

Я делаю регистратор неактивности пользователя для внутреннего приложения на работе, и у меня возникли проблемы с записью потребляемых сообщений в базу данных MySQL, когда я пытаюсь вызвать метод, который пишет сообщения в базу данных, он выдает ошибку : «AccessEye.LogData» - это «тип», который недопустим в данном контексте.Почему я не могу вызвать свой метод WriteLogDataToDb?

Любая помощь в этом будет оценена, это проект оконных форм с использованием сервиса topshelf, который используется как потребитель 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 типа, но вы, наверное, знаете.

С другой стороны, я полагаю, что один из параметров для лямбда-выражения является экземпляром требуемого типа.

Какой из методов Suscribe() относится к типу AccessEye.LogData?

Edit:

Как говорит ОП в своем комментарии, решение было заменить исходный код этого фрагмента кода:

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

Nevermind, я решил эту проблему по-другому, спасибо, в любом случае, ваш ответ помог =] –

+0

Принимая мой ответ положительный для меня (спасибо!), если решение, которое вы приняли, , Я думаю, что лучше всего сделать ответ на свой вопрос с лучшим/принятым решением для вашей проблемы. Делая это, вы можете помочь любому, кто проверяет этот вопрос в будущем. – HuorSwords

0

Казалось бы, ваше действие является неправильным, что вы хотите для записи в базу данных является тел сообщения, а не тип сообщения;

Program.bus.Subscribe<AccessEye.LogData>(queue, (msg, messageRecInfo) => 
    Task.Factory.StartNew(() => 
     { 
      WriteLogDataToDb(msg.Body); 
     })); 
Смежные вопросы