您好,感谢您的帮助。
我有一个wcf服务,我正在尝试正确模块化。
我有兴趣了解是否有更好的方法或实现文件和目录结构以及instanciatation,是否有更合适的抽象方式,我可能会丢失?
这是最好的方法吗?特别是如果表现和处理成千上万的同声要求的能力?
目前我有以下结构:
-Root \ Service.cs
public class Service : IService { public void CreateCustomer(Customer customer) { CustomerService customerService = new CustomerService(); customerService.Create(customer); }public void UpdateCustomer(Customer customer) { CustomerService customerService = new CustomerService(); customerService.Update(customer); }
}
-root \客户\ CustomerService.cs
public void Update(Customer customer)
{
//DO SOMETHING
}
public void Delete(int customerId)
{
//DO SOMETHING
}
public Customer Retrieve(int customerId)
{
//DO SOMETHING
}
注意:我不在此示例中包含Customer对象或DataAccess库,因为我只关心该服务。
如果你能让我知道你的想法,你是否了解更好的方法,或者知道可以提供帮助的资源。
谢天谢地。 史蒂文
答案 0 :(得分:0)
我使用过网络服务软件工厂并喜欢它的结构。
示例代码中的结构是这样的:
BYA.Mfg.SCM.Svc.WCF
Source
Business Logic
BYA.Mfg.SCM.Svc.WCF.BusinessEntities
BYA.Mfg.SCM.Svc.WCF.BusinessLogic
Resource Access
BYA.Mfg.SCM.Svc.WCF.DataAccess
Service Interface
BYA.Mfg.SCM.Svc.WCF.DataContracts
BYA.Mfg.SCM.Svc.WCF.FaultContracts
BYA.Mfg.SCM.Svc.WCF.MessageContracts
BYA.Mfg.SCM.Svc.WCF.ServiceContracts
BYA.Mfg.SCM.Svc.WCF.ServiceImplementation
Tests
答案 1 :(得分:0)
由于多种原因,这可能是无法解决的,但我猜这个问题的广泛性与它有很大关系。此外,分析具有较少背景的设计有点挑战性。这里也有很多问题,使答案变得复杂。
首先,您提到了几个不在示例代码中的类。我假设Customer引用了CustomerService,同样也引用了其他提到的类和示例?
你问是否有更好的实施方式。您可能希望查找“FlyWeight”模式和“Factory”模式等设计模式来帮助您完成此任务。我提到“FlyWeight”,因为你谈到了性能。
“设计模式”一书将为您提供帮助。此外,Martin Fowler的重构(尽管用Java编写)将有很大帮助。
答案 2 :(得分:0)
我不知道这是最好的(甚至推荐)目录结构,但这是我现在已经解决的问题。
.\MyProject
|----\bin
|----\MyProject (main application)
|----\MyProject.Core (shared libraries)
|----\MyProject.Server (WCF-hosting Windows service)
|----\MyProject.Services (the WCF services)
|---------\MyProject.Services.Service1 (WCF Service1)
|---------\MyProject.Services.Service1.Support (WCF Service1-specific libraries)
|---------\MyProject.Services.Service2 (WCF Service2)
|---------\MyProject.Services.Service2.Support (WCF Service2-specific libraries)
根据此目录结构和到目前为止显示的内容,Service类将进入MyProject.Services目录下的MyProject.Services.Service文件夹。 CustomerService类将放在MyProject.Services目录下的MyProject.Services.Service.Support文件夹中。
我没有足够的数据库来理解打开多个同时连接之间的权衡,或者只是反复重复使用相同的连接。我的猜测是你做这件事的方式是首选的解决方案。
考虑到每次调用WCF服务时(通过创建新的CustomerService对象)将处理推迟到数据库,您可能会从使WCF服务成为单例中受益。通常,WCF单例由于可伸缩性原因而不受欢迎,因为假设它们在各种服务调用之间共享状态,因此必须同步。但是,如图所示,您的WCF服务不直接维护任何状态。它只是访问数据库以创建,更新,删除或获取客户。只要使用适当的锁定方案访问数据库,就可以避免与WCF服务的每次调用实例化相关的开销。要使您的服务成为单身人士,请在您的服务上使用以下属性:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Service : IService
{
}