使用MicrosoftPracticesUnity 依赖注入Word下载.docx
《使用MicrosoftPracticesUnity 依赖注入Word下载.docx》由会员分享,可在线阅读,更多相关《使用MicrosoftPracticesUnity 依赖注入Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
usingSystem.Text;
usingSystem.Threading.Tasks;
usingMicrosoft.Practices.Unity;
namespaceUnitySample
{
publicinterfaceICustomerDataAccess
{
voidSave(Customerc);
}
publicclassCustomerSqlDataAccess:
ICustomerDataAccess
publicvoidSave(Customerc)
Console.Write("
{2},savedataid:
{0},name{1}"
c.Id,c.Name,this.GetType().ToString());
publicclassCustomerMysqlDataAccess:
c.Id,c.Name,this.GetType().ToString());
publicclassCustomer
publicICustomerDataAccessCustomerDataAccess{get;
set;
publicstringId{get;
publicstringName{get;
publicvoidSave()
CustomerDataAccess.Save(this);
classProgram
staticvoidMain(string[]args)
}
传统做法可能是在配置文件中填几个一个变量dbType=sqlormysql.然后在customer对象中根据设定的dbtype来实力化不同的dataaccess.
代码可能会是下面这个样子,这样的话,customer对象实际上依赖于CustomerSqlDataAccess和CustomerSqlDataAccess的,而且,未来比如要新增加其他数据库的支持,则必须修改customer对象的源代码。
publicCustomer()
if(DbType="
sql"
)
CustomerDataAccess=newCustomerSqlDataAccess();
else
下面我们使用unity来解除customer对象对CustomerSqlDataAccess和CustomerSqlDataAccess的依赖。
一、属性注入(PropertyInjection)
1.配置unity
为了以后调用方便,我这里建立了一个静态方法,然后注入了两个dataaccess。
publicclassUnitySetup
publicstaticvoidConfig()
varcontainer=newUnityContainer();
container.RegisterType&
lt;
ICustomerDataAccess,CustomerSqlDataAccess&
gt;
();
("
mysql"
);
然后我们需要在Main函数中调用这个方法配置unitycontainter.
staticvoidMain(string[]args)
UnitySetup.Config();
2.标记属性注入
这步很简单,直接在customer类中的ICustomerDataAccess定义上面添加[Dependency]标注即可。
[Dependency]
publicICustomerDataAccessCustomerDataAccess{get;
3.通过resove获取对象
UnitySetup.Config(container);
varsqlCustomer=container.Resolve&
ICustomerDataAccess&
varmysqlCustomer=container.Resolve&
上面的代码就分别获取了CustomerSqlDataAccess实例和CustomerSqlDataAccess实例
二、构造器注入(ConstructorInjection)
unityContainer.RegisterType&
Customer&
(
newInjectionConstructor(newResolvedParameter&
()));
mysqlCustomer"
)));
添加两行注册customer对想到container.
2.获取
varmyqlCustomer=container.Resolve&
完整代码如下
usingSystem.Data;
Console.WriteLine("
publicstaticvoidConfig(IUnityContainerunityContainer)
ICustomerDataAccess,CustomerMysqlDataAccess&
privateICustomerDataAccessCustomerDataAccess{get;
publicCustomer(ICustomerDataAccesscustomerDataAccess)
CustomerDataAccess=customerDataAccess;
sqlCustomer.Save();
myqlCustomer.Save();
Console.ReadKey();
三、方法调用注入(MethodCallInjection)
方法调用注入和输入注入有点类似,只需要在调用的方法上面添加[InjectionMethod]标注即可
newInjectionMethod("
SetDataAccess"
newResolvedParameter&
完成后的代码如下
[InjectionMethod]
publicvoidSetDataAccess(ICustomerDataAccessdataAccess)
CustomerDataAccess=dataAccess;
mysqlCustomer.Save();
好了,通过使用unity依赖注入,customer对象不再依赖具体的CustomerSqlDataAccess和CustomerMysqlDataAccess.,只依赖于接口ICustomerDataAccess。
上面就是unity的基本用法介绍。