2010-01-07 32 views
3

我需要在c#中使用WCF为多个Web服务创建项目。 Web服务将调用其他程序集来执行核心处理。程序集将从SQL Server访问数据。其中一个将成为每个Web服务方法一部分的参数将包括要使用的数据库。我的问题是如何将数据库参数传递给程序集使用。我无法更改所有要使用的卫星组件的签名。我想参考卫星组装参考的某种变量。这些相同的卫星程序集与Windows窗体应用程序和ASP.NET应用程序一起使用,所以我需要有所有类型的应用程序都可以使用的东西。静态字段不好,因为对于一个Web服务调用,数据库可能是“X”,而另一个则是“Y”。有任何想法吗?C#Web服务和使用变量

+2

Ouch。你在这里做的任何事情最多都会成为黑客。我认为你最好的选择就是开始重构,使用SOA,IoC,也许是服务工厂,更多的解耦,并在那里抛出更多的流行语。认真。然后使用某种枚举或中性标识符来确定应该使用哪个数据存储库(数据库)(因为web服务应该与谁调用它无关)。 – slugster 2010-01-07 23:20:41

+1

或者您可能只有多个Web服务实例,每个实例对应一个数据存储库,然后客户端可以调用相应的实例。只要你的客户端应用程序在他们的配置文件中声明指定了web服务的东西,这将是微不足道的 - 如果它是硬编码的,那么你将被搞砸:) – slugster 2010-01-07 23:23:29

+0

+1重构和引入IoC等。是否有理由“无法更改所有签名”? – Sapph 2010-01-07 23:23:54

回答

2

这是一种可以很好地与IoC或DI框架一起玩的东西 - 具有包含数据库信息的一些接口,并将它推送到您的所有呼叫者中。即使没有IoC,在界面中隐藏实现听起来像一个坚实的计划。

随着你的static概念;一个[ThreadStatic]可能会工作,但有点hacky(你需要对清理呼叫者之间的数据有宗教信仰),或另一种选择是在Principal上松开一些信息,因为这是从WCF(每个呼叫)和winforms(通常每个进程)。无论哪种情况,请注意任何线程切换(异步等)。尤其要注意的是,ASP.NET可以在单个页面管道中间更改线程。