|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
c++是语言,其实C++和net网页编程的应用范围根本就不一样的。在net网页编程应用的领域内,c++是不合适的。所以微软才搞了C#和net网页编程对抗。明天在开辟博客园博客程序的WCF服务时,想在“WCF服务虚现”中经由过程机关函数举行依附注进。代码以下:- publicclassBlogService:IBlogService{privateIBlogSiteService_blogSiteService;publicBlogService(IBlogSiteServiceblogSiteService){_blogSiteService=blogSiteService;}}
复制代码 依附注进容器用的是Unity,IBlogSiteService的完成已在WCFHost运转时经由过程Bootstrapper举行注进,拜见孤单云云俊丽:离开Application_Start,让初始化代码更幽美。但是在客户端挪用这个WCF服务时,却呈现非常:Theservicetypeprovidedcouldnotbeloadedasaservicebecauseitdoesnothaveadefault(parameter-less)constructor.
Tofixtheproblem,addadefaultconstructortothetype,orpassaninstanceofthetypetothehost. 呈现这个非常属一般征象,我没有告知WCFHost,它怎样晓得我要举行依附注进,我们之间又没故意灵感到。WCF按惯例做事,经由过程默许机关函数创立WCF服务的实例,以是激发非常。
那怎样办理这个成绩呢?
小软(微软)早就思索到这一点了,供应了IInstanceProvider与IServiceBehavior接口。我们只必要完成这两个接口,并让完成IServiceBehavior的类成为一个Attribute(承继自Attribute),然后加在WCF服务虚现类上,就能够完成WCF的机关函数依附注进。
详细完成步骤以下:
1、完成IInstanceProvider接口-IocInstanceProvider
1.新建一个类IocInstanceProvider,完成IInstanceProvider接口。
2.完成IInstanceProvider接口的三个办法,并引进你本人的IoC容器(好比我们用的是CNBlogs.Infrastructure.CrossCutting.IoC),也就是让WCF经由过程你的IoC容器猎取WCF服务的实例。示例代码以下:- publicclassIocInstanceProvider:IInstanceProvider{Type_serviceType;IContainer_container;publicIocInstanceProvider(TypeserviceType){_serviceType=serviceType;_container=CNBlogs.Infrastructure.CrossCutting.IoC.IoCFactory.Instance.CurrentContainter;}#regionIInstanceProviderMemberspublicobjectGetInstance(InstanceContextinstanceContext,Messagemessage){return_container.Resolve(_serviceType);}publicobjectGetInstance(InstanceContextinstanceContext){returnGetInstance(instanceContext,null);}publicvoidReleaseInstance(InstanceContextinstanceContext,objectinstance){if(instanceisIDisposable)((IDisposable)instance).Dispose();}#endregion}
复制代码 注:你的IoC容器要事前注进了响应的WCF服务的实例。好比我们的注进:- container.RegisterType<IBlogService,BlogService>();
复制代码 个中IBlogService是WCF服务接口,BlogService是WCF服务虚现。
2、完成IServiceBehavior接口-IocServiceBehavior
1.新建一个类IocServiceBehavior,承继自Attribute,完成IServiceBehavior- publicclassIocServiceBehavior:Attribute,IServiceBehavior
复制代码 2.完成IServiceBehavior的AddBindingParameters()办法,并引进之前创立的IocInstanceProvider- publicclassIocServiceBehavior:Attribute,IServiceBehavior{#regionIServiceBehaviorMemberspublicvoidAddBindingParameters(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase,Collection<ServiceEndpoint>endpoints,BindingParameterCollectionbindingParameters){foreach(variteminserviceHostBase.ChannelDispatchers){vardispatcher=itemasChannelDispatcher;if(dispatcher!=null){dispatcher.Endpoints.ToList().ForEach(endpoint=>{endpoint.DispatchRuntime.InstanceProvider=newIocInstanceProvider(serviceDescription.ServiceType);});}}}publicvoidApplyDispatchBehavior(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase){}publicvoidValidate(ServiceDescriptionserviceDescription,ServiceHostBaseserviceHostBase){}#endregion}
复制代码 3、在WCF服务虚现类上增添[IocServiceBehavior]属性代码以下:- [IocServiceBehavior]publicclassBlogService:IBlogService{privateIBlogSiteService_blogSiteService;publicBlogService(IBlogSiteServiceblogSiteService){_blogSiteService=blogSiteService;}#regionIBlogServiceMemberspublicBlogSiteDtoGetBlogSiteWithPosts(intblogId,boolwithPostBody,intitemcount){return_blogSiteService.GetWithPosts(blogId,withPostBody,itemcount);}#endregion}
复制代码 弄定!是否是很轻松!
下面的完成代码参考自DomainOrientedN-Layered.NET4.0SampleApp(http://microsoftnlayerapp.codeplex.com/),假如你对DDD感乐趣,保举浏览这个项目标代码。
小结
你IoC了吗?假如没有,你真的Out了。不但ASP.NET能够轻松IoC(想爱简单,相处难:当ASP.NETMVC爱上IoC),并且单位测试也能够IoC(妄想成实际:用xUnit.net在单位测试中完成机关函数依附注进)。
可怜的程序员,还是逃不出移植的命运! |
|