У меня есть проект, который использует 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