2012-12-06 19 views
6

DI kullanarak bir nesnenin nasıl yönetileceğini merak ediyorum. BenTek kullanımlık sınıfları yönetme Bağımlılık Enjeksiyon

class Foo : IFoo, IDisposable 
{ 
    // ... 
} 

O zaman bu sınıfın başka bir sınıftan enjekte edilen bir sınıf var varsayalım

class Bar 
{ 
    public Bar(IFoo foo) 
    { 
     this.Foo = foo 
    } 

    IFoo Foo { get; set; } 
} 

Sonra (benim örnek MVC ve Ninject kullanır)

this.Bind<IFoo>().To<Foo>().InRequestScope(); 

Bazı kapsamında bu bağlama Merak ediyorum, Bağımlılık Enjeksiyon çerçevesi Foo'un yaşam döngüsünü ele aldığından, Bar numaralı telefondan kimliğini uygulamalı mıyım? Benim düşüncem DI Foo yaşam döngüsü yönetiyor, bu yüzden başka bir sınıf Foo kullanıyorsa, ona dokunmayın. tek kullanımlık obje yapıcı parametre olarak Bar geçirilir beri Ayrıca, Bar değil wrap tek kullanımlık obje yapar, bu yüzden Bar ait arayan çöp toplanır FooBar sonra kullanmak istediği bilmiyor. Bu doğru mu?

+1

Nicholas Blumhardt'ın bu konuyla ilgili bir açıklaması var. Örneğin, Autofact örneğidir ancak genel olarak http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/ – fsimonazzi

+0

Bazı MSDN makalelerine bakıldığında, Microsoft'un her ikisini de yapacağını düşünüyor: http://msdn.microsoft.com/en-us/library/yhfzs7at%28v=vs.110%29 (StremReader) "StreamReader nesnesi, StreamReader öğesi sağlanan Stream nesnesinde Dispose() öğesini çağırır .Dispose " ama http://msdn.microsoft.com/en-us/library/z7ha67kw%28v=vs.110%29 (Bitmap)" Bitmap'in ömrü boyunca akışı açık tutmalısınız. " – Michael

cevap

3

Evet, varsayımlarınız doğru. Ninject, nesneyi sizin için ortadan kaldıracaktır.

+0

Test ederken bunu farkettim. Sanırım asıl sorum, bir nesneyi bertaraf etmekten kimin sorumlu olduğu. Aramaya dayanan sonucum, tek kullanımlık nesneyi yaratan nesnenin, onu tasfiye etmekten sorumlu olmasıdır. Yani, bu durumda Ninject. – Michael

3

Bu, yaşam süresini yönetmenin genel sorunudur. Temel kural, bir nesneyi yaratan kişinin, bu örneğin sahipliğine sahip olmasıdır. Sahibi bu örneği elden çıkarmalı/imha etmelidir. Mülkiyet, başka bir kişiye devredilebilir, bu da bu örneği yok etmekten 'başkasının' sorumlu olmasını sağlar.

Örneğinizde Foo örneği Bar tarafından oluşturulmadığından, bu örneğin yok edilmekten bar sorumlu değildir. Ninject bu örneği sizin için yarattığından, temizlikten sorumludur.

Mülkiyet geçebilir, ancak bu açık bir şey olmalıdır. Bu yöntem yeni IFoo örneklerini oluşturur

IFoo CreateNewFoo(); 

rağmen, o geri arayana sahipliğini geçtiği oldukça açıktır: açık mülkiyet geçen iyi bir örnek Fabrika tasarım kalıbıdır.

Sahiplik geçirmenin bir BAD yönteminin iyi bir örneği, .NET'in StreamReader sınıfıdır. Kurucusunda tek kullanımlık bir nesne alır, ancak sahipliğini alır. Belgeleme, sınıfın verilen nesneyi kullandığını belirtse de, bu davranış birçok geliştiriciyi göz kamaştırır, çünkü bu, genel sahiplenme kuralına aykırıdır. Microsoft, sonunda, verilen akımın bertaraf edilmesini engelleyen bir ctor aşırı yükünü ekleyerek .NET 4.5'te bu sorunu çözdü.