Web服务和静态方法

时间:2011-03-29 23:21:35

标签: .net asp.net web-services design-patterns

我正在使用ASP.NET Web服务,例如:

[WebMethod]
public void DeleteColumn(long columnId)
{
    Column.DeleteColumn(columnId);
}

问题在于,sudh编程需要许多静态方法 例如,如果我想在没有静态方法的情况下做事,我将不得不这样做:

[WebMethod]
public void DeleteColumn(Column c)
{
    c.DeleteColumn();
}

我认为这个实现有两个问题:

  1. 我必须为Column类创建一个空构造函数。
  2. 我必须从客户端整个对象而不是一个参数传递。在使用此Web服务时,我无法知道客户端应该填写哪些成员以执行该方法(在这种情况下删除)。
  3. 我相信我写的最后一种方法还有很多问题,但我也知道静态方法不适合面向对象的编程。
    你怎么看?我该如何实施网络服务? 是否存在针对此类问题或Web开发人员设计模式的地方?

2 个答案:

答案 0 :(得分:4)

为什么不从您传入的ID中初始化您的Column对象?

[WebMethod]
public void DeleteColumn(long columnId)
{
    Column c = new Column(columnId);
    c.DeleteColumn();
}

我在这里猜一点,但是你希望避免使用static方法的原因之一是它们更容易测试?如果是这种情况,您可以将Column对象的创建委托给其他工厂对象,以便于为测试目的注入假列。

[WebMethod]
public void DeleteColumn(long columnId)
{
    IColumn c = ColumnFactory.CreateColumn(columnId);
    c.DeleteColumn();   // Could be any object that implements IColumn
}

答案 1 :(得分:2)

您应该使用依赖注入。大多数DI框架都有可用的插件,因此您只需更改.svc文件即可指定主机工厂。然后你的代码可能看起来更像这样。

private IColumnRepository _columnRepository;
public MyWebService(IColumnRepository columnRepository)
{
    _columnRepository = columnRepository;
}
[WebMethod]
public void DeleteColumn(long columnId)
{
    _columnRepository.DeleteColumn(columnId);
}

修改

抱歉,我没有意识到这是ASMX。如果您有选项,则应该切换到WCF。根据{{​​3}}:

  

本主题特定于传统技术。现在应使用Windows Communication Foundation(WCF)创建XML Web服务和XML Web服务客户端。

但即使你坚持使用ASMX,依赖注入也是一个可行的选择。例如,使用Ninject,您可以执行以下操作:

[Inject]
public IColumnRepository ColumnRepository {get;set;}
public MyWebService()
{
    Injection.Kernel.Inject(this);
}
[WebMethod]
public void DeleteColumn(long columnId)
{
    _columnRepository.DeleteColumn(columnId);
}

它更紧密地将您与注入内核联系起来,但您仍然可以获得依赖注入的许多优点。