Удаленное взаимодействие - PullRequest
2 голосов
/ 09 июля 2009

У меня есть проект, который использует Unity, и я пытаюсь реализовать NET Remoting. У меня есть NET Remoting Server для существующего сервисного уровня, который имеет уровень данных, использующий блок приложения доступа к данным библиотеки Enterpise. Проблема заключается в том, что из-за удаленного взаимодействия требуется конструктор без параметров при вызове TestService. получить исключение нулевой ссылки. Любые идеи о том, как реализовать это с Unity?

Вот мой код:

TestService из сервисного уровня:

public class TestService : MarshalByRefObject, ITestService
{
    private ITestRepository repository;

    public TestService(ITestRepository repository)
    {
        this.repository = repository;        
    }

    public TestService() <--- parameterless constructor
    {}

    public List<Book> GetBooks()
    {
        return repository.GetBooks();
    }

TestRepository из уровня данных:

public class TestRepository : ITestRepository
{
    private Database db;

    public TestRepository(Database db)
    {
        this.db = db;      
    }

    public List<Book> GetBooks()
    {
      List<Book> list = new List<Book>();
        list.Add(new Book(1, "test book 1"));
        list.Add(new Book(2, "test book 2"));
        return list;
    }     

Книжный класс:

[Serializable]
public class Book : MarshalByRefObject
{
    public int ID { get; set; }
    public string Name { get; set; }

    public Book() { }
    public Book(int id, string name)
    {
        this.ID = id;
        this.Name = name;
    }
}

Простой тест RemotingServer:

TestRepository testRepository;
TestService testService;

IUnityContainer container = new UnityContainer();

container.AddNewExtension<EnterpriseLibraryCoreExtension>();
container.AddNewExtension<DataAccessBlockExtension>();


container.RegisterType<ITestRepository, TestRepository>();

container.RegisterType<ITestService, TestService>();

testService = container.Resolve<TestService>();

TcpServerChannel channel = new TcpServerChannel(9988);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(TestService), "TestService", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Press Any Key");
System.Console.ReadKey();

Простой клиент удаленного взаимодействия:

ChannelServices.RegisterChannel(new TcpClientChannel());
            ITestService testService = (ITestService)Activator.GetObject(typeof(ITestService), "tcp://localhost:9988/TestService");


        foreach(Book item in testService.GetBooks())
        {
            Console.WriteLine("Book:\n" + item.Name);    
        }


        Console.ReadKey();

Вот полное исключение:

строка 40 вызывает хранилище. GetBooks ();

в Test.Services.IssueService.GetBooks () в TestService.cs: строка 40 в System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage (аргументы IntPtr md, Object [], сервер объектов, Int32 methodPtr, логический fExecuteInContext, Object [] & outArgs) в System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage (RuntimeMethodHandle md, аргументы Object [], сервер объектов, Int32 methodPtr, логический fExecuteInContext, Object [] & outArgs) в System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage (сообщение IMessage, Int32 methodPtr, логическое значение fExecuteInContext)

Спасибо

John

...