2010-04-29 26 views
6

Kodda bir yere nasıl özüleceğimi bulmaya çalışıyorum. Uygulama BaşlangıçtaResolve örneği - Autofac

Ben, bir tür

Şimdi
static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

kayıtlı nasıl kodunda bir yerde bir örneğini çözebilirim? StructureMap yılında

Getting Started kadar okuyun statik nesne ObjectFactory.GetInstance<IFoo>()

cevap

10

yoktur. Başlaman gerek.

İlk bakışta aradığınız şey container. Bu basit bir WinForms app gibi ContainerBuilder onu kurmak:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

genel bir fikir sadece ilk veya en üstteki örneği çözmek zorunda olmasıdır. Kapsayıcı, yapıcı parametrelerini kullanarak bağımlılık enjeksiyonuna dayalı olarak tüm diğer örnekleri oluşturmayı ele alacaktır.

Eğer DI kalıbı uygulamanız boyunca takip ediliyorsa, yalnızca başlangıçta bir kez kaba dokunmanız gerekir.

En üstteki örneği nasıl çözüyorsanız büyük ölçüde hangi uygulama türüne bağlı olduğunuza bağlıdır. Bir web uygulamasıysa, ASP.Net integration ve MVC integration sizin için halledecektir. (Sonuçta, ASP.Net'deki en üstteki örnek, denetimimizin dışında olan Application'dur).

Öte yandan, bir konsol uygulaması veya WinForms uygulaması, yukarıdaki örneğimde olduğu gibi, ilk örneği Main'da manuel olarak çözersiniz.

+0

Örnek bu, ama ne daha fazla sınıfta bir örneğe ihtiyacım varsa? Türü her sınıfa kaydedemez. – user137348

+1

Ancak, bu en üstteki örneği kodda bir yerlerde çözmeniz gerekiyor. Türler, başlangıçta (Global.asax) kaydedilir ve kodun en üstteki örneğini çözmeniz gerekir. Sonunda, bunu belirten bir yazı buldum. http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx Bu yaklaşım hakkında ne düşünüyorsunuz? – user137348

+0

Güncellenmiş cevabımı görün ... ve evet, @Sharpoverrides yaklaşımı tamam, Global.asax'ın konteyner oluşturma koduyla karıştırılmamasını sağlar. Sonuçta, kabı test eden ve konteynırı oluşturan tek bir sorumluluk sınıfına sahip testçileri daha kolay test etmeyi sağlayan gerçekten yazmanız gerekir. –

İlgili konular