Daha basit olması için bir hizmeti nasıl sararım


11

Sadece 3 yönteme ihtiyaç duyduğumuz devasa bir arayüzü ortaya çıkaran bir üçüncü taraf hizmetine bağımlılığımız var. Ayrıca, arayüz sık sık değişir ...

Arayüzü projemizdeki bir sınıfa sarmaya ve sadece ihtiyacımız olan yöntemleri ortaya çıkarmaya karar verdim.

Ancak, dönüş değerlerini nasıl işlemem gerektiğinden emin değilim ... Arabirim türü bir nesne döndürür Storage. Dahili StorageModelolarak a Storage.

Eşleştiriciye ne döndürürdünüz: Storageveya StorageModel? StorageServiceEnjekte edilen sargının bağımlılığını elde eden bir DataService'imiz var .

Şu anda bunu şöyle yapıyorum:

public class StorageService 
{
    private readonly IExternalStorageWrapper externalStorageWrapper;

    public StorageService(IExternalStorageWrapper externalStorageWrapper)
    {
        this.externalStorageWrapper = externalStorageWrapper;
    }

    public StorageModel GetStorage(int storageId)
    {
        return this.externalStorageWrapper.GetStorage(storageId).ConvertToStorageModel();
    }
}

public class ExternalStorageWrapper : IExternalStorageWrapper
{
    public Storage GetStorage(int storageId)
    {
        using(var ext = new ExternalStorage())
        {
            return ext.GetStorage(storageId);
        }
    }
}

Ne söylerdiniz:

  • Yukarıdaki gibi iyi, sargının dış Storagenesneyi ve iç nesnenin iç nesneyi StorageServicedöndürmesi iyi StorageModelmi?
  • Yoksa StorageModelzaten bir sargıya iade eder misiniz ?

2
Neden bir paketleyici olarak adlandırıyorsun? Cephe, köprü ve adaptör desenine daha iyi bakın. Anladığım kadarıyla, bir sarıcı üçüncü taraf hizmetinin tüm yöntemlerini sağlayacaktır - ancak bu istediğiniz şey değil.
Tobias Otto


Bir sargının, sarılmış nesnenin tüm davranışlarını göstermesi gerekmediği için , "Sınırlı sarıcı" başlıklı bu makaleye bakın .
guillaume31

Yanıtlar:


11

Benim düşünceme göre, sarıcı dış kütüphane ile ilgili her şeyi ele almalıdır. Bu, Wrapper'ın genel arabiriminin herhangi bir harici türü adlandırmaması gerektiği anlamına gelir.

Harici türleri uygulamanızın ilgili türleriyle eşleştirmek ambalajcının görevlerinin bir parçasıdır. Bu önemsiz bir işlem değilse, sorunu çözmek için mevcut çeşitli araçları kullanabilirsiniz, örneğin bir çevirmen nesnesinin enjekte edilmesi. Ancak, çevirmen yine de sarmalayıcı modülünüzün bir parçası olmalıdır ve uygulamanızın başka hiçbir bölümü ona bağlı olmayabilir.

Bu şekilde, uygulamanızın geri kalanı yalnızca kütüphanedeki değişikliklere değil, aynı zamanda kütüphanenin başka bir kütüğün yerine geçmesine karşı tamamen bağışıktır.


3

Arayüzü projemizdeki bir sınıfa sarmaya ve sadece ihtiyacımız olan yöntemleri ortaya çıkarmaya karar verdim.

Bu iyi. Bu, Adaptör olarak da bilinir .

Sen seçmek Adaptörü burada amaç bu yüzden, desen dönüştüren bir arayüz başka (domain modeli) içine (kütüphane modeli). Dolayısıyla, öncekinden bir şey etki alanı modeline ulaşırsa , bağdaştırıcı amacına başarısız olur .

Önceki argümanlara göre, adaptör StorageModel.

Nihayetinde, etki alanınız Storagebir yabancı olan belirli bir dili "konuşuyor" .

Ama dönüş değerlerini nasıl ele almam gerektiğinden emin değilim ...

Buradaki anahtar , kütüphaneyi hangi nedenle sardığınızı / uyarladığınızı bilmektir .

Adaptör, Dekoratör, Cephe desenleri benzerliklere sahip olabilir, ancak oldukça farklıdırlar. Çözdükleri sorunlar kadar farklı.

Bununla ilgili olarak da ilginizi çekebilir:


1

Bir kitaplığı çoğaltarak etkin bir şekilde satamazsınız.

Sarmanız gereken, kitaplığı kullanmanızdır ve bu, nesneleri göstermemek anlamına gelir, bu durumda Depolama. Onları da kopyalamaya çalışmayın.

Kütüphaneyi kullanın, fakat içeride saklayın. Bu nedenle, bir şeyleri saklamak için StorageService'i kullandığınızı varsayarak, depolara sarmanız gerekir

MyPocoObjectRepo
    MyPocoObject GetObject(string id);

burada MyPocoObject tamamen sizin verileriniz ve iş mantığınızdır. Depolama veya DataReader veya başka bir şeyin kopyası değil


0

Cevap, Storagedoğrudan olmayan bir sınıftan doğrudan erişmeniz gerekip gerekmediğine bağlıdır StorageModel.

Kütüphaneyi saracaksanız, ileride kütüphanenin gelecekte yapacağınız kanıt değişikliklerine izin vermek için döndürdüğü nesneyi de sarmak mantıklıdır. Bununla birlikte Storage, doğrudan kullanmanız gerekirse , duruma göre geri dönmeniz gerekebileceği anlamına gelir Storage. StorageBuradaki kullanımı StorageModel, programınız boyunca tutarlı kalmasını istediğiniz gibi göstermek için bir argüman söylenebilir .

Yine de yapmıyorsanız, hem arayüzü hem de döndürülen nesneyi sarmanızı şiddetle tavsiye ederim, yine de, sadece StorageModelprogram boyunca kullanıyorsanız ve kullanmıyorsanız mantıklıdır Storage.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.