SORU
22 Aralık 2009, Salı


Orada nesneler Dİ bir kap ile yaratılan başlatma için bir kalıptır

Birlik benim nesneleri oluşturulmasını yönetmek için çalışıyorum ve çalıştırma kadar bilinen bazı başlatma parametrelerini vermek istiyorum:

Şu anda bunu yapmanın yolu düşünebildiğim tek yolu arabirimi Init yöntemi.

interface IMyIntf {
  void Initialize(string runTimeParam);
  string RunTimeParam { get; }
}

Daha sonra kullanmak için (Birlik) bunu yapmak istiyorum:

var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");

Bu senaryoda runTimeParam param kullanıcı girişi dayalı çalışma zamanında belirlenir. Önemsiz durumda burada sadece runTimeParam değerini döndürür ama gerçekte parametre dosya ve başlatma yöntemi dosyası ile bir şeyler yapacak gibi bir şey olacak.

Bu Initialize yöntemi arabirim üzerinde kullanılabilir ve birden çok kez çağrılabilir konularda bir dizi, yani oluşturur. Uygulamasında bir bayrak ayarı Initialize tekrar çağrı istisna atma yolu aksak görünüyor.

Ben arayüzü gidermek noktada IMyIntf uygulama hakkında hiçbir şey bilmek istemiyorum. Ne de olsa, bu arayüz bir kez başlatma belirli parametreleri gereken bilgi istiyorum. Orada bir şekilde bir şekilde açıklamak(öznitelikler?) bu bilgi ile arabirim ve nesne oluşturulduğunda çerçeve alacağım?

Edit: biraz daha fazla. arayüzü Açıklanan

CEVAP
22 Aralık 2009, Salı


İhtiyacınız olan herhangi bir yerde çalıştırma, belirli bir bağımlılık oluşturmak için değerSoyut Fabrikaçözüm.

Arabirimler üzerinde olması Başlatma yöntemleri bir kokusu varSızıntılı Soyutlama.

Sizin durumunuzda üzerinde İMyİntf arayüzü modeli gerektiğini söyleyebilirimnasıl kullanmak gerekir- nasıl bunların uygulamaları oluşturmak için niyet. Bu uygulama ayrıntı.

Böylece, Arayüzü Basit olmalıdır:

public interface IMyIntf
{
    string RunTimeParam { get; }
}

Şimdi Soyut Fabrika tanımlayın:

public interface IMyIntfFactory
{
    IMyIntf Create(string runTimeParam);
}

Şimdi bunun gibi İMyİntf somut örneğini oluşturan İMyİntfFactory somut bir uygulama oluşturabilirsiniz:

public class MyIntf : IMyIntf
{
    private readonly string runTimeParam;

    public MyIntf(string runTimeParam)
    {
        if(runTimeParam == null)
        {
            throw new ArgumentNullException("runTimeParam");
        }

        this.runTimeParam = runTimeParam;
    }

    public string RunTimeParam
    {
        get { return this.runTimeParam; }
    }
}

Bu bize izin verir nasıl dikkat edinsınıf değişmezler . korumak readonly anahtar kelime kullanarak. Hayır kokulu Başlatma yöntemleri gereklidir.

İMyİntfFactory bir uygulama bu kadar basit olabilir:

public class MyIntfFactory : IMyIntfFactory
{
    public IMyIntf Create(string runTimeParam)
    {
        return new MyIntf(runTimeParam);
    }
}

İMyİntf örneğine ihtiyacınız olan tüm tüketiciler, sadece içinden isteyerek İMyİntfFactory bir bağımlılıkYapıcı Enjeksiyon.

Tuz eğer doğru bir şekilde kayıt varsa Otomatik Tel sizin için İMyİntfFactory bir örneği olacaktır değerinde herhangi bir Dİ Konteyner.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • TecNoob

    TecNoob

    15 AĞUSTOS 2013