Ich komme aus der .NET-Welt und ich versuche herauszufinden, was die "Rails Way", um ein Objekt über mehrere Ebenen in einer Multi-Tier-Anwendung zu übergeben.Was ist der 'Rails Way', um Objekte über mehrere (logische) Ebenen hinweg zu übergeben?
Ich schreibe eine Multi-Carrier-Preisgestaltung API. Im Grunde genommen in meiner Preis Controller ich Zugriff auf die folgenden Parameter haben params [: carrier], params [: address_from], params [: address_to], params [: CONTAINER_TYPE] usw. Ich habe eine Validierung Bibliothek, eine Compliance-Bibliothek und eine Preisfinder-Bibliothek, die sich jeweils mit einer Teilmenge der Parameter befassen.
In .NET würden die Parameter in Datenübertragungsobjekten (DTOs) oder Verträgen verkapselt werden. Vor dem Aufruf einer der Bibliotheken würden sie in Domänenobjekte (DOs) umgewandelt werden und jede Bibliothek würde auf den DOs arbeiten, wodurch eine enge Kopplung der DTOs vermieden würde. Die Ruby-Programmierung empfiehlt die Verwendung von "Duck Typing", so dass meine Bibliotheken direkt auf Params arbeiten können (obwohl Sie auf Symbole und nicht auf Objekte/Eigenschaften zugreifen würden). Oder sollte ich meine Params in ein PriceRequest-Objekt einordnen und meine Bibliotheken mit PriceRequest arbeiten lassen?
Option 1:
class PricesController < ApplicationController
def get
CarrierValidator.validate(params)
...
end
end
class CarrierValidator
def self.validate(params)
raise CarrierError if !Carrier.find_by_name(params[:carrier_name]).exists?
end
end
Option 2:
class PricesController < ApplicationController
def get
pricesRequest = PricesRequest.new(carrier_name: params[:carrier_name], ...)
pricesRequest.validate
...
end
end
class PriceRequest
attr_accessor : ...
def initalize
...
end
def validate
CarrierValidator.validate(self.carrier_name)
end
end
class CarrierValidator
def self.validate(carrier_name)
raise CarrierError if !Carrier.find_by_name(carrier_name).exists?
end
end
TIA,
J
können Sie hier einen Beispielcode posten? –