需要返回某个东西的void方法

时间:2011-12-13 16:42:52

标签: c# linq-to-sql

我的代码中有一个必须具有void返回类型的方法,并且它只能采用一个特定的参数。我需要从中归还一些东西。

为您提供详细信息:我有一个WCF服务,它具有SQL服务器访问权限。它有一个名为SQLMetal.exe的程序生成的代码。这给了我一个部分方法的部分类(DataContext)。我正在构建这个partial类的另一部分,这些部分方法就像'InsertUser'或'DeleteUser'。它们没有在partial类的其他部分实现,但我想这意味着我必须实现它们。这很好,但是如果它们是部分方法,它们必须有一个void返回类型。

那么如果我想从其中一个中返回一些内容怎么办?我的意思是,应用程序可以连接到此服务,并可以使用它来访问数据库信息。该应用程序需要知道服务端是否存在错误。

因此,它是一个带有void返回类型和一组预定义参数的部分方法。

怎么办?

编辑:更多详情!

首先,为什么我不能更改生成的代码?嗯,这是一个很好的建议,但我对此表示担忧。它生成的原因是为了尽量减少未来的编码问题,如果数据库要改变而你必须重新生成代码。

其次,一些代码:

[System.Data.Linq.Mapping.DatabaseAttribute(Name = "HVD01")]

public partial class HydraDataContext : System.Data.Linq.DataContext

{



    private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();



    #region Extensibility Method Definitions

    partial void OnCreated();

    partial void InsertClient(Client instance);

    partial void UpdateClient(Client instance);

这就是生成代码的相关部分。

然后是我的一部分。这是在另一个与生成的部分结合的部分类中。

public void UpdateClient(Client client)
    {
        //Primary key can't be zero
        if (client.ClientID == 0)
            return;


        dc.Clients.Attach(client, true);

        dc.SubmitChanges();

    }

显然有可能需要返回的东西。

例外怎么样?好吧,如果我在WCF服务上抛出一个,我不认为应用程序会得到它(我可能在这里错了)。该应用程序使用该服务,但我不认为在该服务上抛出异常将到达消费应用程序。会吗?

也许只是改变功能是最好的。我只是想到了重点是尽可能多地保留生成的代码,以防你需要重新生成它。

再次感谢。

5 个答案:

答案 0 :(得分:8)

您不会从void方法返回任何内容。调用代码不会指望你,并且如果你以某种方式不知道该怎么做。

  

这很好,但是如果它们是部分方法,它们必须有一个void返回类型。

为什么他们是部分方法?如果生成的代码中不存在它们,那么您可以根据需要在部分类中定义它们。如果它们确实存在,不要试图改变它们的足迹,否则你会破坏它们。

  

该应用程序需要知道服务端是否存在错误。

这就是例外情况。如果出现错误,请抛出异常。

答案 1 :(得分:6)

我希望你能在这种情况下抛出一个异常来通知客户端出了什么问题:

throw new Exception("I do not believe that parameter means what you think it means");

答案 2 :(得分:6)

您可以将您想要返回的参数作为参考。

 void DoSomethingOnService(ref object value);

答案 3 :(得分:2)

为什么不只使用班级成员?

public class Foo
{
   string _result;

   void DoSomething(string param1)
   {
      _result = param1;
   }
}

答案 4 :(得分:2)

您提到的这些部分方法旨在允许您挂钩LinqSql的内部工作 - 它们实际上不应该成为您的数据访问层的公共API。您可以将任何其他您喜欢的公共方法添加到DataContext类中(没有签名限制) - 尽管我建议您查看Repository Pattern

编辑回复评论

这是一个简单的存储库实现的伪示例,它可以充当DataContext的公共包装器,并且可以返回有关操作结果的上下文信息,如您在帖子中所描述的那样..

public class ClientRepository
{
    public ClientRepository()
    {
        this.DataContext = new HydraDataContext();
    }

    private HydraDataConetxt DataContext { get; set; }

    // DBResult is a made up class which returns some info about the operation...
    public DBResult Insert(Client client)
    {
        try
        {
            this.DataContext.Clients.InsertOnSubmit(client);
            this.DataContext.SubmitChanges();

             return DBResult.Success;
        }
        catch (Exception error)
        {
             return DBResult.Failed(error.Message);
        }
    }
}

希望能让你深思熟虑:)