Unity IOC容器配置——使用配置文件
程序员文章站
2022-03-19 15:01:34
...
这里只介绍配置文件方法的类型映射,到具体的项目一般也都会推荐用配置文件的方法
1.Demo框架
控制台程序,一个接口类库,一个服务类库Qurey
实现IQuery
接口,模拟返回一些数据
public interface IQuery
{
List<string> GetStr();
}
public class Query : IQuery
{
public List<string> GetStr()
{
return new List<string> { "str1", "str2", "str3" };
}
}
2.创建一个AddTimeSpan类,将IQuery得到的字符串加上时间戳
public class AddTimeSpan
{
private IQuery query = null;
/// <summary>
/// 以前我们都是在构造函数时传入具体的细节,如public AddTimeSpan(Query _query){}
/// 现在构造函数中我们将不依赖细节
/// </summary>
/// <param name="_query"></param>
public AddTimeSpan(IQuery _query)
{
query = _query;
}
public List<string> GetData()
{
List<string> result = new List<string>();
query.GetStr().ForEach(c => result.Add($"{c}+{DateTime.Now}"));
return result;
}
}
3.引用需要的包
4.新建配置文件Unity.config用于存放Unity的配置信息
新建的配置文件记得使用“始终复制
”。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!--Unity IOC-->
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="IQueryContainer">
<!--Unity.Interface.IQuery指类/接口的完成类型名,Unity.Interface指类/接口所在的dll-->
<register type="Unity.Interface.IQuery, Unity.Interface" mapTo="Unity.Service.Query, Unity.Service"/>
</container>
</containers>
</unity>
</configuration>
5.设计容器工厂
只写配置文件是不行,因为我们是控制台程序并没有框架帮我实现注入
新建一个UnityFactory
类
using Microsoft.Practices.Unity.Configuration;
using System.Configuration;
using System.IO;
using Unity;
public class UnityFactory
{
//静态字段,保证单列
private static IUnityContainer unityContainer = null;
//静态构造函数,保证单列
static UnityFactory()
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap
{
ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"ConfigFiles\Unity.config")
};
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
//UnityConfigurationSection类 需要NuGet Unity.Configuration;
UnityConfigurationSection section = configuration.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
unityContainer = new UnityContainer();
section.Configure(unityContainer, "IQueryContainer");
}
public static IUnityContainer GetUnityContainer()
{
return unityContainer;
}
}
最后的文件目录如图所示
6.程序入口测试
class Program
{
static void Main(string[] args)
{
AddTimeSpan addTimeSpan = new AddTimeSpan(UnityFactory.GetUnityContainer().Resolve<IQuery>());
var list = addTimeSpan.GetData();
list.ForEach(c => Console.WriteLine(c));
Console.Read();
}
}
运行程序,不出意外的话 是会报错的
异常很明显了,我们无法注册Unity.Interface.IQuery, Unity.Interface
因为我们控制台程序环境中根本没有我们注册的Unity.Service.Query, Unity.Service
。
有两个解决方法
1.在控制台程序中右击引用Unity.Service
就可以了。
2.上面的方法,不够彻底,我们还是要依赖Unity.Service
,如果Unity.Service
不是我们自己开发的呢,就无法引用了,我们在资源管理器中打开将Unity.Service
的dll复制到我们exe目录下即可。
相信效果已经很明显了,我们根本不需要关系IQuery的具体实现,我们这个Unity.Service.dll
可以来自任何人开发,只要满足我们IQuery接口约束。
上一篇: 微信8.0炸弹没特效怎么办?微信8.0表情没特效的解决方法
下一篇: spring(二)IOC