Bağımlılık Enjeksiyonu ve Singleton. Tamamen farklı iki kavram mı?


17

İş arkadaşım için Singleton'a bağımlılık enjeksiyonunu kullanmayı duydum. Birbirleri ile değiştirilebilen iki dikey kalıp olup olmadığını hala anlayamıyorum? Yoksa DI, Singleton modelini test edilebilir hale getirmek için bir yöntem midir?

Lütfen aşağıdaki kod snippet'ine bir göz atın.

    IMathFace obj = Singleton.Instance;

    SingletonConsumer singConsumer = new SingletonConsumer(obj);

    singConsumer.ConsumerAdd(10,20);

The SingletonConsumertüründe bir parametre kabul ediyor IMathFace. Singleton sınıfına dahili olarak erişmek yerine SingletonConsumer, arayan tarafından iletilen singleton örneğini alırsınız. Bağımlılık enjeksiyonu yoluyla singleton sınıfı tüketmenin iyi bir örneği mi?


Lütfen DI'nin singletonu nasıl değiştirebileceğini söyleyebilir misiniz?

7
Singleton bir tasarım modelidir. DI / IoC bir tekniktir.
Dave

2
DI, Singleton'ın yerini bir muzun karbüratörün yerini alabileceğinden daha fazla değiştiremez. Tamamen farklı konseptler.
Dave

benim örneğim geçerli.

1
Evet, ancak kapsülleme pahasına gelebilir (tekil olmayanlar için de geçerlidir) bkz: stackoverflow.com/questions/1005473/…

Yanıtlar:


17

Klasik Singleton uygulamasını statik bir erişimciyle kullanmak yerine, hizmetin tek bir örneğini enjekte etmek için bağımlılık enjeksiyonunu kullanmanız gerektiğini düşünüyorum MySingleton.Instance.

public class MySingleton
{
    public static MySingleton Instance{get{...}};
}

Klasik singleton uygulaması ile tüm kodlarınız bu servisin singleton olmasına bağlıdır. Temelde bu varsayımı, kullandığınız her seferde tüketen kod haline getirebilirsiniz MySingleton.Instance.

Öte yandan DI ile kurucunuza aktarılan hizmetin bir örneğini alıp depolarsınız. Bu hizmetin yalnızca tek bir örneğinin olması bir uygulama ayrıntısıdır. Tüketici koduna farklı bir örnek vermek için bunu kolayca değiştirebilirsiniz. Bu şekilde, tek bir örnek olmasını zorunlu kılmak yerine, tek bir örnek tarafından uygulanan bazı sınıf / arabiriminiz olur.

Örneğin, test için hizmetin sahte bir uygulamasını istiyorsanız veya programın farklı bölümlerinin bu hizmetin farklı yapılandırmalarına ihtiyacı varsa yararlıdır.


4

Evet haklısın. Nesneye singleton üzerinden erişmek yerine, ona bir referans geçiyorsunuz, böylece bir yapıcı enjeksiyonu kullanıyorsunuz.

Başkalarının belirttiği şey, bu kavramların birbiriyle ilişkili olmadığıdır. Enjekte ettiğiniz nesne, enjekte edilen nesnenin nereden geldiğini gerçekten umursamadığından, tek bir örneği kullanmak özel bir şey değildir.


3

Singleton paterni ve DI / IoC'nin Singleton enjeksiyonuyla kesiştiği bir durum vardır.

Çoğu DI çerçevesi, enjekte edilen bir nesnenin tek bir örneğini başlatmak üzere yapılandırılabilir. Böyle bir nesnenin örneğini isteyen herhangi bir tüketici nesnesi aynı tek örneği alır. Bu örnek tanım gereği bir Singleton'dur. Kavramdaki çakışma için bu kadar.


2

Buradaki karışıklık, iki kavramın sınırlandırılmış olmasıdır: singleton ve singleton örneğine statik erişimci / ağ geçidi.

Doğru olarak tanımladığınız gibi, iş arkadaşınız bağımlılığın doğrudan Singleton.Instance(statik ağ geçidi) kullanılarak erişilmek yerine enjekte edilmesini öneriyor .

Bunun tekil kalıpla gerçekten ilgisi olmamasının nedeni, aynı DI kavramının tekil olmayan bir nesnenin somutlaştırılması için eşit olarak geçerli olmasıdır new Foo(). Bağımlılık, tek bir uygulama olup olmadığına bakılmaksızın enjekte edilir.

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.