我正在使用ASP.NET Web服务,例如:
[WebMethod]
public void DeleteColumn(long columnId)
{
Column.DeleteColumn(columnId);
}
问题在于,sudh编程需要许多静态方法 例如,如果我想在没有静态方法的情况下做事,我将不得不这样做:
[WebMethod]
public void DeleteColumn(Column c)
{
c.DeleteColumn();
}
我认为这个实现有两个问题:
我相信我写的最后一种方法还有很多问题,但我也知道静态方法不适合面向对象的编程。
你怎么看?我该如何实施网络服务?
是否存在针对此类问题或Web开发人员设计模式的地方?
答案 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);
}
它更紧密地将您与注入内核联系起来,但您仍然可以获得依赖注入的许多优点。