Пустой метод, который должен что-то вернуть - PullRequest
0 голосов
/ 13 декабря 2011

В моем коде есть метод, который должен иметь тип возвращаемого значения void, и он должен принимать только один конкретный параметр. Мне нужно что-то вернуть из этого.

Чтобы дать вам подробности: у меня есть служба WCF, которая имеет доступ к SQL-серверу. В нем был код, сгенерированный программой SQLMetal.exe. Это дало мне частичный класс (DataContext) с частичными методами. Я создаю другую часть этого частичного класса, и эти частичные методы являются такими вещами, как «InsertUser» или «DeleteUser». Они не реализованы в другой части частичного класса, но я думаю, это означает, что я должен реализовать их. Это нормально и все, но если они являются частичными методами, они должны иметь возвращаемый тип 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 ]

8 голосов
/ 13 декабря 2011

Вы ничего не возвращаете из void методов.Вызов кода не будет ожидать вас, и не будет знать, что с ним делать, если вы как-то это сделали.

Это нормально и все, но если они являются частичными методами, они должны иметьтип возврата void.

Почему они являются частичными методами?Если они не существуют в сгенерированном коде, тогда вы можете определить их в своей части частичного класса, как хотите.Если они существуют, не пытайтесь изменить их след, или вы что-то сломаете.

Это приложение должно будет знать, если произошла ошибка на стороне службы.

Вот для чего и исключения.Если есть ошибка, выведите исключение.

6 голосов
/ 13 декабря 2011

вы можете поместить параметр, который вы хотите вернуть как ссылку.

 void DoSomethingOnService(ref object value);
6 голосов
/ 13 декабря 2011

Я надеюсь, что в этом случае вы выдадите исключение, чтобы уведомить клиента о том, что что-то пошло не так:

throw new Exception("I do not believe that parameter means what you think it means");
2 голосов
/ 13 декабря 2011

Эти частичные методы, о которых вы упомянули, предназначены для того, чтобы позволить вам подключиться к внутренней работе LinqSql - они не должны становиться публичным API вашего уровня доступа к данным.Вы можете добавить любые другие общедоступные методы, которые вам нравятся, в класс DataContext (без ограничений на подпись) - хотя я бы рекомендовал изучить Шаблон репозитория .

Редактировать В ответ на комментарий

Вот пример psuedo простой реализации репозитория, которая может выступать в качестве публичной оболочки вокруг 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);
        }
    }
}

Надежда, которая дает пищу для размышлений:)

2 голосов
/ 13 декабря 2011

Почему бы просто не использовать класс?

public class Foo
{
   string _result;

   void DoSomething(string param1)
   {
      _result = param1;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...