Бъркам с реактивни разширения и попаднах на камък, който не мога да разбера каква е причината за живота си.
Ако използвам приложение за конзолен режим .NET 4, където всичко е статично, както следва:
using System;
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;
using RxProducer;
namespace Runner
{
class Program
{
private static readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
private static readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();
static void Main()
{
_subject.Subscribe(RespondToNewData);
}
private static void RespondToNewData(DaftFrog frog)
{
_frogRepo.Save(frog);
}
}
}
DaftFrog е просто тестов клас в моя фалшив DAL клас, това е прост проект за библиотека на .NET 4 Class, класът DaftFrog е прост poco с няколко полета, методът dal.save просто прави конзола.WriteLine of поле в обекта DaftFrog.
И двата класа са просто заместници за истинските неща, след като се справя с работата на RX кода.
Както и да е, обратно към проблема, така че кодът по-горе работи добре и ако направя няколко
_subject.OnNext(new DaftFrog());
обажда се, фалшивият dal клас, разпечатва това, което очаквам и всичко работи добре...
ОБАЧЕ>....
Ако след това транспортирам този код такъв, какъвто е, в библиотека от класове и след това актуализирам тази библиотека от класове от моята "статична програма", както следва:
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;
namespace RxProducer
{
public class Producer
{
private readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
private readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();
private int _clock;
public void Start()
{
_subject.Subscribe(RespondToNewData);
}
public void Stop()
{
}
public void Tick()
{
if(_clock % 5 == 0)
{
DaftFrog data = new DaftFrog();
_subject.OnNext(data);
}
_clock++;
}
private void RespondToNewData(DaftFrog frog)
{
_frogRepo.Save(frog);
}
}
}
И след това използвайте този клас в моята програма
using System;
using RxProducer;
namespace Runner
{
class Program
{
private static readonly Producer _myProducer = new Producer();
static void Main()
{
_myProducer.Start();
while(!line.Contains("quit"))
{
_myProducer.Tick();
line = Console.ReadLine();
}
_myProducer.Stop();
}
}
}
Тогава проектът ми не успява да се компилира.
По-конкретно се проваля на линията:
_subject.Subscribe(RespondToNewData);
в библиотеката на класовете RxProducer, нещо повече, грешката, която компилаторът връща, също няма смисъл:
Error 1 The best overloaded method match for 'System.Reactive.Subjects.Subject<FakeDal.Entites.DaftFrog>.Subscribe(System.IObserver<FakeDal.Entites.DaftFrog>)' has some invalid arguments H:\programming\rxtesting\RxProducer\Producer.cs 17 7 RxProducer
Error 2 Argument 1: cannot convert from 'method group' to 'System.IObserver<FakeDal.Entites.DaftFrog>' H:\programming\rxtesting\RxProducer\Producer.cs 17 26 RxProducer
Отначало си помислих, че това може да е от статичното нещо, така че направих всичко в библиотеката на класа статично и това нямаше никакво значение.
Наистина не съм правил много с Rx досега, но работя с C# и VS 99% от времето, така че съм наясно, че грешката ми казва, че не може да конвертира тип от някакво описание, просто не Не разбирам защо ми казва това, особено когато кодът работи перфектно в статичната програма, но не и в библиотека от класове.
Шаути
АКТУАЛИЗИРАНЕ
Втори размисъл, просто знам, че ще има хора, които настояват да публикувам определенията за фалшиви и глупави жаби, въпреки че IMHO те няма да са задължителни, но за да успокоят ордите от претенденти, които ще питат, ето ги :-)
using System;
namespace FakeDal
{
public class Repository<T>
{
public void Save(T entity)
{
Console.WriteLine("Here we write T to the database....");
}
}
}
namespace FakeDal.Entites
{
public class DaftFrog
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsTotalyDaft { get; set; }
}
}