【问题标题】:using ninject with a remoting server将 ninject 与远程服务器一起使用
【发布时间】:2011-04-04 13:15:35
【问题描述】:

我有一个类Server,它实现了接口IServer,可以使用.net 远程访问(我对JICYAW 问题没有选择权)。

在内部,此服务器使用其他类来实现逻辑和数据访问。

这个server 类具有构造函数注入的依赖项,它需要完成其工作。

当客户端调用(每次调用)时,远程处理框架将使用无参数构造函数而不是(当然)使用 Ninject 实例化 Server 实例。

我怎样才能让 Ninject 成为负责新课程的人?

我见过类似的 SO question 但这与 Ninject 无关。

感谢您的帮助

【问题讨论】:

    标签: c# .net dependency-injection ninject remoting


    【解决方案1】:

    您可以创建一个将由客户端调用的服务外观。这个门面会在内部调用你的容器来解析真正的服务。例如:

    public class ServiceFacade : IService
    {
        private readonly IService service;
    
        // default constructor
        public ServiceFacade()
        {
            this.service = YourContainer.Current.Resolve<IService>();
        }
    
        void IService.ServiceOperation()
        {
            this.service.ServiceOperation();
        }
    }
    

    【讨论】:

    • 谢谢!简单干净。但是有没有办法在不添加另一层的情况下做到这一点?
    • 使用过Remoting,我建议代理的额外层是值得的。否则,使用像@Steven 这样的注射器是一个不错的方法。
    【解决方案2】:

    可行的方法是使用代理拦截对这些对象的调用并将调用转发给真实对象。请注意,我对此不是很有经验,所以我不确定这是否真的有效,但这里是:

    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,但这就是我的远程处理经验停止的地方:-)

    【讨论】:

    • 再次感谢史蒂文,在见证了这一点之后,我认为 ill take neotapirs 的建议在这里是你的第一个建议。 (我认为自定义服务器消息接收器可能是此处缺少的链接)
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2011-10-17
    • 2011-03-28
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多