time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > C# > 【C#】一分钟学会用StructureMap

【C#】一分钟学会用StructureMap

时间:2010-07-14 00:11 点击:5644次 字体:[ ]




StructureMap是一款DI(依赖注入)工具。

StructureMap是用来定义接口<->实现之间的对应关系的!不然,你就要自己new东西了。

我通过一个简单的例子,说明一下如何快速地使用它!

 

我先用一个类图,来说明一下程序,免得直接看代码,有点伤眼睛!

                                                                                            
________________ ________________ ________________
| | | | | |
| IOutput |<------| IAppEngine |----->| IGreeter |
|________________| |________________| |________________|
/_\ /_\ /_\
| | |
| | |______________________
_______|________ _______|________ _______|________ _______|________
| | | | | | | |
| ConsoleOutput | | AppEngine | | EnglishGreeter | | ChineseGreeter |
|________________| |________________| |________________| |________________|

IAppEngine => 应用

IGreeter     => 打招呼

IOutput      => 输出

IAppEngine依赖于接口IOutput、IGreeter.

IAppEngine的实现类AppEngine,先通过IGreeter得到一个字符串,然后再把这个字符串传给IOutput输出。

 

相对应代码如下所示

 

using System;
using NUnit.Framework;
using StructureMap;

namespace KSharp
{
[TestFixture]
class SMTestFixture
{
[SetUp]
public void Setup()
{
ObjectFactory.Initialize(x
=>
{
//x.UseDefaultStructureMapConfigFile = true;
x.IgnoreStructureMapConfig = true;
x.For
<IAppEngine>().Singleton().Use<AppEngine>();
x.For
<IGreeter>().Use<ChineseGreeter>();
x.For
<IOutput>().Use<ConsoleOutput>();
});
}

[Test]
public static void TestMethod()
{
IAppEngine appEngine
= ObjectFactory.GetInstance<IAppEngine>();
appEngine.Run();
}
}

public interface IAppEngine
{
void Run();
}

public interface IGreeter
{
string GetGreeting();
}

public interface IOutput
{
void Show(string message);
}

public class AppEngine : IAppEngine
{
private readonly IGreeter _greeter;
private readonly IOutput _outputDisplay;

public AppEngine(IGreeter greeter, IOutput outputDisplay)
{
this._greeter = greeter;
this._outputDisplay = outputDisplay;
}

public void Run()
{
_outputDisplay.Show(_greeter.GetGreeting());
}
}

public class EnglishGreeter : IGreeter
{
public string GetGreeting()
{
return "Hello";
}
}

public class FrenchGreeter : IGreeter
{
public string GetGreeting()
{
return "Bonjour";
}
}

public class ChineseGreeter : IGreeter
{
public string GetGreeting()
{
return "你好";
}
}

public class ConsoleOutput : IOutput
{
public void Show(string message)
{
Console.WriteLine(message);
}
}
}

 

ObjectFactory是一个静态类,相当于一个全局变量!

在Setup方法中,调用ObjectFactory.Initialize()方法,对之进行配置。

可以,用下图来反映出配置结果

                                              
________________ ________________
| | | |
| IAppEngine ------------> AppEngine |
| | | |
| IGreeter ------------> ChineseGreeter|
| | | |
| IOutput ------------> ConsoleOutput |
|________________| |________________|


Setup完毕后,在TestMethod中,就可以通过刚刚设置好的ObjectFactory来获取指定的实例了。

如果,不想每次都new新的,就先调一下Singleton

 

除了通过代码的方式,来对ObjectFactory进行配置外,也可以通过创建一个StructureMap.config文件来对之进行配置:

 

 

<?xml version="1.0" encoding="utf-8" ?>
<StructureMap>

<Assembly Name="KSharp" />

<PluginFamily Assembly="KSharp" Type="KSharp.IAppEngine" DefaultKey="Default">
<Plugin Assembly="KSharp" Type="KSharp.AppEngine" ConcreteKey="Default"/>
</PluginFamily>

<PluginFamily Assembly="KSharp" Type="KSharp.IGreeter" Scope="Singleton" DefaultKey="cn">
<Plugin Assembly="KSharp" Type="KSharp.EnglishGreeter" ConcreteKey="en"/>
<Plugin Assembly="KSharp" Type="KSharp.FrenchGreeter" ConcreteKey="fr"/>
<Plugin Assembly="KSharp" Type="KSharp.ChineseGreeter" ConcreteKey="cn"/>
</PluginFamily>

<PluginFamily Assembly="KSharp" Type="KSharp.IOutput" DefaultKey="Default">
<Plugin Assembly="KSharp" Type="KSharp.ConsoleOutput" ConcreteKey="Default"/>
</PluginFamily>

</StructureMap>

把这个config文件,放到StructureMap.dll所在的文件夹下,即可。

这时,还需要把ObjectFactory.Initialize()的lambda参数改成:

 

ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile
= true;
//x.IgnoreStructureMapConfig = true;
//x.For<IAppEngine>().Singleton().Use<AppEngine>();
//x.For<IGreeter>().Use<ChineseGreeter>();
//x.For<IOutput>().Use<ConsoleOutput>();
});


本文地址 : http://www.fengfly.com/plus/view-184124-1.html
标签: C# StructureMap
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: