最近项目中使用了StructureMap接口映射,需要简单配置;配置好了使用起来也很方便,也利于以后直接扩展修改某一个接口的实现文件。
1.web.config 中添加设置。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="StructureMap" type="StructureMap.Configuration.StructureMapConfigurationSection,StructureMap"/>
</configSections>
<StructureMap MementoStyle="Attribute">
<DefaultInstance PluginType="AZKA.IMS.Model.ICommRepository, AZKA.IMS.Model" PluggedType="AZKA.IMS.SqlRepository.CommRepository, AZKA.IMS.SqlRepository" Scope="Singleton"/>
</StructureMap>
</configuration>
解释:
StructureMap 的 DefaultInstance配置项目,PluginType属性是接口类型,接口名词空间,PluggedType属性是接口实现类,实现类名词空间;Scope是设置的控件模式。
生命周期
StructureMap容器托管的对象,生命周期支持以下几种(xml中的Scope配置,或者是初始化时的相关方法例如CacheBy进行设置)
PerRequest: 每次请求都新建一个实例对象
Singleton: 单例
ThreadLocal: 每线程对应一个实例
HttpContext: 在一个HttpContext上唯一
HttpSession: 在一个HttpSession上唯一
Hybrid: 混合模式,如果存在HttpContext则设置在HttpContext上,否则设置在当前线程上
另外StructureMap也支持使用自定义的生命周期,实现StructureMap.Pipeline.ILifecycle接口即可。
2.增加一个Ioc接口容器配置器的类:
可以放在Web项目的App_Code中:
/// <summary>
/// Summary description for IocConfigurator
/// </summary>
public class IocConfigurator
{
/// <summary>
/// Configures this instance.
/// </summary>
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.PullConfigurationFromAppConfig = true;
x.SetAllProperties(y =>
{
y.OfType<ICommRepository>();
});
});
}
3.Global.asax需要执行IocConfigurator类的配置初始化方法:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
IocConfigurator.Configure();
//log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~")+@"\log4net.config"));
}
4.页面PreLoad加载:
首先Web项目需要加载SturctureMap.dll.
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
StructureMap.ObjectFactory.BuildUp(this);
}
页面中增加接口操作变量:
public ICommRepository CommRepositoryOper { get; set; }
在页面的事件中可直接使用CommRepositoryOper 来执行方法。
private void InitData()
{
#region Header
//initial hospital data
ddlHospital.ItemsClear();
List<Hospital> listHosp = CommRepositoryOper.GetHospitalByUser(CreatedBy).ToList();
ddlHospital.DataSource = listHosp;
ddlHospital.DataValueField = "HospitalId";
ddlHospital.DataTextField = "HospitalName";
ddlHospital.DataBind();
ddlHospital.ItemsInsert(0, new ListItem("请选择", "0"));
#endregion
}
至此,从配置SturctureMap到使用完成。
参考:http://www.cnblogs.com/RicCC/archive/2010/04/01/structuremap-demo.html