IOC模式 又被称为依赖倒置模式。 它将原本调用者类+功能类 的耦合关系改成 调用者类+中间类、中间类+功能类。
下面开始 从简单模式开始一步一转换为IOC模式:
1 简单的调用者加两个功能类。相互间耦合紧密
namespace DesignModeApp.IOC.Ver1_Nomal
{
class OperationMain
{
public void PalyMedia()
{
Player player = new Player();
MediaFile file = new MediaFile();
file.FileName = "C:\\Music.mp3";
player.Play(file);
}
}
class Player
{
public void Play(MediaFile file)
{
Console.WriteLine("Play:" + file.FileName);
}
}
class MediaFile
{
public string FileName;
}
}
2 使用接口、基类来解耦合
namespace DesignModeApp.IOC.Ver2_Interface
{
class OperationMain
{
public void PalyMedia()
{
IPlayer player = new Player();
IMediaFile file = new MediaFile();
file.FileName = "C:\\Music.mp3";
player.Play(file);
}
}
interface IPlayer
{
void Play(IMediaFile file);
}
class Player: IPlayer
{
public void Play(IMediaFile file)
{
Console.WriteLine("Play:" + file.FileName);
}
}
interface IMediaFile
{
string FileName { get; set; }
}
class MediaFile: IMediaFile
{
public string FileName { get; set; }
}
}
3 使用IOC模式,利用配置文件来控制功能类的实例化:
namespace DesignModeApp.IOC.Ver3_IOC
{
class OperationMain
{
public void PalyMedia()
{
string namespce_String = ConfigurationManager.AppSettings["NameSpace"];
string name_Player = ConfigurationManager.AppSettings["IPlay_Name"];
string name_MediaFile = ConfigurationManager.AppSettings["IPlay_Name"];
IPlayer player = (IPlayer)Assembly.Load(namespce_String).CreateInstance(name_Player);
IMediaFile mediaFile = (IMediaFile)Assembly.Load(namespce_String).CreateInstance(name_MediaFile);
player.Play(mediaFile);
}
}
interface IPlayer
{
void Play(IMediaFile file);
}
class Player : IPlayer
{
public void Play(IMediaFile file)
{
Console.WriteLine("Play:" + file.FileName);
}
}
interface IMediaFile
{
string FileName { get; set; }
}
class MediaFile : IMediaFile
{
public string FileName { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="NameSpace" value="DesignModeApp"/>
<add key="IPlay_Name" value="IOC.Ver3_IOC.Player"/>
<add key="IMediaFile_Name" value="IOC.Ver3_IOC.MediaFile"/>
</appSettings>
</configuration>
4 最后使用依赖注入技术(Unity 库)。同时修改调用类 的构造函数。从而用构造参数来设置 功能类。尽管不知道这有什么用。
namespace DesignModeApp.IOC.Ver4_DI
{
class Program
{
static UnityContainer container = new UnityContainer();
static void Init()
{
container.RegisterType<IPlayer, Player>();
container.RegisterType<IMediaFile, MediaFile>();
}
static void Run()
{
Init();
OperationMain op1 = container.Resolve<OperationMain>();
op1.PalyMedia();
}
}
class OperationMain
{
IPlayer _player;
IMediaFile _mediaFile;
public OperationMain(IPlayer player, IMediaFile mediaFile)
{
_player = player;
_mediaFile = mediaFile;
}
public void PalyMedia()
{
_player.Play(_mediaFile);
}
}
interface IPlayer
{
void Play(IMediaFile file);
}
class Player : IPlayer
{
public void Play(IMediaFile file)
{
Console.WriteLine("Play:" + file.FileName);
}
}
interface IMediaFile
{
string FileName { get; set; }
}
class MediaFile : IMediaFile
{
public string FileName { get; set; }
public MediaFile()
{
FileName = "C:\\Music.mp3;";
}
}
}
参考博客:
作者:Qlin 出处:Qlin - 博客园