你真的了解Ioc与AOP吗?(4)

本部分示例代码请参考"src/Step4"目录

五、使用Remoting对原有系统进行改造

如果使用Remoting技术对HelloGenerator进行改造,使其具有分布式远程访问能力,那么在不使用Ioc技术的情况下,我们将会作出如下调整:

(1)让HelloGenerator继承自MarshalByRefObject类

如果要让某个对象具有分布式的功能,必须使其继承自MarshalByRefObject,这样才可以具有远程访问的能力。因此我们需要调整EnHelloGenerator和CnHelloGenerator的代码。这里以EnHelloGenerator为例:

using System;
namespace IocInCSharp
{
   public class EnHelloGenerator : MarshalByRefObject, IHelloGenerator
   {
      public string GetHelloString(string name)
      {
         return String.Format("Hello, {0}", name);
      }
   }
}

(2)将修改后的HelloGenerator发布出去

在这一步中,我们创建了一个新的Console应用程序RemotingServer,并在其中注册了一个Channel,发布服务并进行监听。代码如下:

using System;
using System.Configuration;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Serialization.Formatters;
namespace IocInCSharp
{
   public class Server
   {
      public static void Main()
      {
         int port = Convert.ToInt32(ConfigurationSettings.AppSettings["LocalServerPort"]);
         try
         {
            BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
            BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
            serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
            IDictionary props = new Hashtable();
            props["port"] = port;
            props["timeout"] = 2000;
            HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
            ChannelServices.RegisterChannel(channel);
            RemotingConfiguration.RegisterWellKnownServiceType(
               typeof(EnHelloGenerator),
               "HelloGenerator.soap",
               WellKnownObjectMode.Singleton);
            Console.WriteLine("Server started!/r/nPress ENTER key to stop the server...");
            Console.ReadLine();
         }
         catch
         {
            Console.WriteLine("Server Start Error!");
         }
      }
   }
}

(3)全新的客户端调用代码

为了使得客户端MainApp能够调用到远程的对象,我们需要修改它的代码,注册相应的Channel并进行远程访问。修改后的MainApp代码如下:

using System;
using System.Configuration;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Serialization.Formatters;
namespace IocInCSharp
{
   public class MainApp
   {
      public static void Main()
      {
         //建立连接
         BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
         BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
         serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
         IDictionary props = new Hashtable();
         props["port"] = System.Convert.ToInt32(ConfigurationSettings.AppSettings["ClientPort"]);
         HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
         ChannelServices.RegisterChannel(channel );

         //创建远程对象
         ISayHello sayHello = new SayHello();
         string RemoteServerUrl = ConfigurationSettings.AppSettings["RemoteServerUrl"];
         sayHello.HelloGenerator = (IHelloGenerator)Activator.GetObject(typeof(IHelloGenerator), RemoteServerUrl);
         sayHello.SayHelloTo("zhenyulu");
      }
   }
}

在这段代码中,远程对象的创建是通过(IHelloGenerator)Activator.GetObject(typeof(IHelloGenerator), RemoteServerUrl)实现的。到此为止,我们就完成了对原有系统的Remoting改造。

经过调整后的系统,其组件间相互依赖关系如下图所示:

注意ICommon.dll文件在Client和Server端都有。

在整个调整过程中,我们修改了Server端的EnHelloGenerator以及CnHelloGenerator的代码,Client端的MainApp也 作了修改,以加入了远程访问机制。那么能不能对原有代码不作任何修改就实现远程访问机制呢?当然可以!不过我们还要请出Sping.net帮助我们实现这一切。

(待续)

### 回答1: IOC(Inversion of Control)是一种编程思想,它将程序的控制权交由容器去管理,在容器中创建对象并将它们连接在一起,从而实现程序组件之间的松耦合。AOP(Aspect-Oriented Programming)是一种编程思想,它通过将横切关注点(如日志、事务等)从业务代码中分离出来,使代码更加简洁和易于维护。它实现这一目的的方式是定义“切面”,将这些切面织入到程序的不同位置,从而实现对程序行为的控制。 ### 回答2: IOC(Inversion of Control)是一种设计原则和思想,它将控制权从应用程序代码中转移到容器或框架中,通过容器来控制对象的创建、依赖注入和生命周期管理。IOC的目的是将代码的控制权从开发人员手中解放出来,使开发人员能够更专注于业务逻辑的实现,提高代码的可读性和可维护性。 AOP(Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(比如日志、事务管理等)从核心业务逻辑中分离出来,以模块化的方式进行处理。AOP将系统划分为核心业务逻辑和横切关注点,通过定义切面来实现对横切关注点的统一管理和控制,使系统更易于理解、维护和扩展。 IOCAOP通常一起使用,互为补充。IOC负责对象的创建和依赖注入,AOP负责横切关注点的处理。在使用IOC容器时,可以通过配置文件或注解来定义对象的创建和依赖关系,容器会负责实现依赖注入和对象的生命周期管理。而在AOP中,可以通过定义切面来划分横切关注点,并在需要的地方将切面织入,以实现对关注点的控制和管理。 总之,IOCAOP是两种不同的编程思想和技术,它们都旨在提高代码的可读性、可维护性和可扩展性,使开发人员能够更加专注于核心业务逻辑的实现。 ### 回答3: IOC全称为Inversion of Control,中文翻译为控制反转。它是一种软件设计的思想和模式,用于实现松耦合的组件之间的交互。在传统的开发中,各个组件之间的依赖关系由开发者手动编码实现,但是在IOC中,控制权被转移到了外部容器中,容器负责管理组件之间的依赖关系。这样一来,各个组件可以更加独立,更加关注自己的功能实现,而不需要关心其他组件的创建和管理。常见的IOC容器有Spring等。 AOP全称为Aspect Oriented Programming,中文翻译为面向切面编程。它是一种编程范式,用于将跨越多个模块和组件的横切关注点进行封装和处理。在传统的开发中,多个模块中的相同行为(例如日志记录、事务管理等)需要在各个模块中手动编码实现,但是在AOP中,可以将这些横切关注点从各个模块中剥离出来,形成单独的切面(Aspect),然后通过动态代理等技术将切面织入到各个模块中。这样一来,各个模块可以更加专注于核心业务逻辑的实现,而不需要关心横切关注点的处理。常见的AOP框架有AspectJ等。 总结来说,IOCAOP都是面向对象编程中的重要概念和设计思想。IOC主要关注组件之间的控制权转移和依赖关系的管理,使得组件更加独立和解耦;AOP主要关注横切关注点的封装和处理,使得模块和组件可以更加专注于核心业务逻辑的实现。通过使用IOCAOP,可以提高代码的可维护性、可扩展性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值