我的代码中有一个必须具有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服务上抛出一个,我不认为应用程序会得到它(我可能在这里错了)。该应用程序使用该服务,但我不认为在该服务上抛出异常将到达消费应用程序。会吗?
也许只是改变功能是最好的。我只是想到了重点是尽可能多地保留生成的代码,以防你需要重新生成它。
再次感谢。
答案 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);
}
}
}
希望能让你深思熟虑:)