c#(wcf)架构文件和目录结构(以及实例化)

时间:2009-05-04 19:15:43

标签: c# wcf architecture

您好,感谢您的帮助。

我有一个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库,因为我只关心该服务。

如果你能让我知道你的想法,你是否了解更好的方法,或者知道可以提供帮助的资源。

谢天谢地。 史蒂文

3 个答案:

答案 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
{
}