在使用Unity的时候,能够很好的解耦,解除层与层之间的依赖性。这里有一个问题,每次向Unity中要对象实例的时候,这时候给出的是同一个吗?还是每次都是new一个新的?我来写代码验证一下。怎么验证两个对象是否为同一个呢,看这个对象在内存中的地址就行了,通过Hash码查看就可以。
namespace UnityApplication
{
public interface IService
{
string Show();
}
}
namespace UnityApplication
{
public class Service : IService
{
public Service()
{
Console.WriteLine("<<<<<<<<<<<<<<");
}
public string Show()
{
return "Hello";
}
}
}
namespace UnityApplication
{
class Program
{
static void Main(string[] args)
{
IUnityContainer container = CreateUnityContainerExe();
IService service = container.Resolve<IService>();
string result = service.Show();
Console.WriteLine("''''''''''" + result + "llllllll" + service.GetHashCode());
IService service2 = container.Resolve<IService>();
Console.WriteLine("lllllllllll" + service2.GetHashCode());
Console.ReadLine();
}
public static IUnityContainer CreateUnityContainerExe()
{
return CreateUnityContainer(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
}
private static IUnityContainer CreateUnityContainer(Configuration configuration)
{
return InitializeContainer(configuration);
}
private static IUnityContainer InitializeContainer(Configuration configuration)
{
var result = new UnityContainer();
foreach (var section in configuration.Sections)
{
var unityConfigurationSection = section as UnityConfigurationSection;
if (unityConfigurationSection != null)
{
result.LoadConfiguration(unityConfigurationSection);
}
}
return result;
}
}
}
需要在配置文件中,配置相应的类与映射关系
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<container>
<register type="UnityApplication.IService, UnityApplication" mapTo="UnityApplication.Service, UnityApplication">
</register>
</container>
</unity>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
最终运行的时候,你会发现控制台输出的哈希地址根本就是不一样的,说明不是同一个实例,对象的地址根本不同,每次都会new一个新的。