используя ninject с удаленным сервером - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть класс Server, который реализует интерфейс IServer, который доступен с помощью удаленного взаимодействия .net (у меня нет выбора по этому вопросу JICYAW).

внутренне этот сервер использует другие классы для реализации логики и доступа к данным.

этот класс server имеет инжектированные конструктором зависимости, необходимые для выполнения своей работы.

, когдаклиент вызывает (за вызов) платформу удаленного взаимодействия, установив экземпляр Server, используя конструктор без параметров, а не (конечно), используя Ninject.

как я могу получить Ninject, отвечающий за новое 'поднимая класс?

я видел этот похожий SO вопрос , но это не относится к Ninject.

спасибо за вашу помощь

Ответы [ 2 ]

3 голосов
/ 04 апреля 2011

Вы можете создать фасад службы, который будет вызываться клиентом. Этот фасад будет вызывать ваш контейнер для разрешения реального обслуживания. Например:

public class ServiceFacade : IService
{
    private readonly IService service;

    // default constructor
    public ServiceFacade()
    {
        this.service = YourContainer.Current.Resolve<IService>();
    }

    void IService.ServiceOperation()
    {
        this.service.ServiceOperation();
    }
}
0 голосов
/ 04 апреля 2011

Что может сработать, так это перехватывать вызовы этих объектов с помощью прокси и переадресовывать вызовы реальному объекту.Обратите внимание, что я не очень опытен в этом, поэтому я не уверен, что это на самом деле работает, но вот так:

public class DependencyInjectionProxy : RealProxy
{
    private object realInstance;

    public DependencyInjectionProxy(Type classToProxy, 
        object realInstance) : base(classToProxy)
    {
        this.realInstance = realInstance;
    }

    public static T MakeProxy<T>(T realInstance)
    {
        return (T)(new DependencyInjectionProxy(typeof(T),
            realInstance).GetTransparentProxy());
    }

    public override IMessage Invoke(IMessage msg)
    {
        if (msg is IMethodCallMessage)
        {
            var message = (IMethodCallMessage)msg;

            object value = message.MethodBase.Invoke(
                this.realInstance, message.Args);

            Console.WriteLine(value);

            return new ReturnMessage(value, null, 0, null, message);
        }

        return msg;
    }
}

Это работает, когда вы делаете что-то вроде этого:

var container = new YourContainer();

container.RegisterSingle<IService, Service>();

IService proxy = DependencyInjectionProxy.MakeProxy<IService>(
    container.Resolve<IService>());

proxy.SomeMethod();

Это прекрасно работает, но, честно говоря, я не знаю, как настроить это таким образом, чтобы вы могли таким образом перехватывать входящие вызовы.Где-то вам нужно зарегистрировать свой DependencyInjectionProxy, но на этом мой опыт с удаленным взаимодействием прекращается: -)

...