Тот факт, что ваши методы возвращаются недействительными, заставляет меня поверить, что ваши обязанности могут быть изменены. Я думаю, что может быть лучше подумать об этом, так как каждый из ваших классов реализует интерфейс IProcessable
, который определяет метод Process
. Тогда каждый класс будет знать, как манипулировать своими собственными данными. Это, я думаю, менее связано, чем наличие класса, который манипулирует данными внутри каждого объекта. Предполагая, что все эти классы происходят от одного базового класса, вы можете поместить части алгоритма обработки, которые совместно используются в базовом классе.
Это немного отличается от случая, когда у вас может быть несколько алгоритмов, которые работают с идентичными данными. Если вам нужна такая функциональность, вам все же может потребоваться реализовать интерфейс, но метод Process
должен принимать параметр типа стратегии и использовать фабрику для создания соответствующей стратегии на основе ее типа. Таким образом, у вас будет класс стратегии для каждого поддерживаемого алгоритма и пары классов данных, но вы сможете сохранить код изолированным. Я бы, вероятно, сделал бы это, только если бы алгоритмы были достаточно сложными, чтобы разделение кода делало его более читабельным. Если это всего лишь несколько строк, которые могут отличаться, вероятно, будет достаточно использовать оператор switch для типа стратегии.
Что касается веб-методов, я думаю, у меня будет другая подпись для класса. Правильное получение данных по сети будет намного проще, если методы будут принимать конкретные классы отдельных типов, чтобы он знал, как правильно сериализовать / десериализовать их. Конечно, на заднем плане веб-методы могут использовать подход, описанный выше.
public interface IProcessable
{
public void Process() {....}
}
public abstract class ProcessableBase : IProcessable
{
public virtual void Process()
{
... standard processing code...
}
}
public class FooProcessable : ProcessableBase
{
public override void Process()
{
base.Process();
... specific processing code
}
}
...
IProcessable foo = new FooProcessable();
foo.Process();
Реализация механизма, основанного на стратегии, немного сложнее.
Веб-интерфейс с использованием объектов доступа к данным
[WebService]
public class ProcessingWebService
{
public void ProcessFoo( FooDataObject foo )
{
// you'd need a constructor to convert the DAO
// to a Processable object.
IProcessable fooProc = new FooProcessable( foo );
fooProc.Process();
}
}