2010-06-10 10 views
6

Yeni bir WPF projesinde (VS2010) Unity 2'yi ilk defa kullanıyorum.Birlikli bir proje çözümünde Unity kullanarak çözümleme nasıl yapılır

Çözüm

WPF Projesi

Sınıf Library1'i

Sınıf Library2

Sınıf Kitaplığı 3 ....

kaydedilmesi i aşağıdaki yapıyı kullanmak Bu projede Unity kullanarak farklı türler aşağıdaki snippet'i kullanarak WPF Projesinde yapılır:

IUnityContainer container = new UnityContainer() 
          .RegisterType<IObjectContext, ObjectContextAdapter>() 
          .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
          .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 

en i Repository <Orders> Sınıf Library1 çözülmesi yapıcı enjekte almak istiyorum şimdi diyelim. Görünüşe göre konteyner diğer projelerde bilinmemektedir!

Bunu nasıl yaparım?

cevap

9

Çoğunlukla Chris'in cevabını kabul ediyorum, fakat yapılandırma dosyalarının icky olduğunu düşünüyorum (özellikle Unity için), bu yüzden çalışma zamanı yapılandırması ile dairesel referanslar kullanmanıza izin verecek bir çözüm var. Bunu kayıtlarla yapacağız.

IConfigureUnity içerecek bir Altyapı projesi oluşturun.

public interface IConfigureUnity 
{ 
    public void Configure(UnityContainer container); 
} 

Sınıf kitaplığınızın her biri, kendi sınıflarını kaydetmek için bu arabirimin uygulanmasından sorumlu olacaktır.

public class RegistryForSomeClassLibrary : IConfigureUnity 
{ 
    public void Configure(UnityContainer container) 
    { 
     container 
      .RegisterType<IObjectContext, ObjectContextAdapter>() 
      .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
      .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
    } 
} 

WPF projenizde, kapsayıcıyı oluşturmanız ve bu kayıtları uygulamanız gerekir.

var container = new UnityContainer(); 
new RegistryForSomeClassLibrary().Configure(container); 
new RegistryForAnotherClassLibrary().Configure(container); 

Artık herhangi bir yapılandırma dosyasıyla tam olarak yapılandırılmış bir kapsayıcı örneğiniz var.

+0

Diyelim ki "ManageUser" adlı Class Library 1'de bir iletişim kutusu var. ManageUser, WPF projesinde bildirilen kapsayıcı örneğini nasıl alır? –

+1

@Ryan - Ortak bir projede arayüz kullanmak için herhangi bir sebep var mı? Neden Kayıt Defteri sınıfını ve Configure yöntemini statik yapmıyorsunuz ve bu nedenle çağırıyoruz: 'RegistryForSomeClassLibrary.Configure (container); RegistryForAnotherClassLibrary.Configure (container); Bunu test ettim ve çalışıyor. Bir şey mi eksik? – Shevek

+0

@Shevek, Bu iyi çalışıyor. Kayıtlarımı yansıma kullanarak çözdüm, ama bir süre geri kaldı. Şimdi açıkça her bir kayıtta 'Configure()' olarak adlandırıyorum. – Ryan

0

Birden çok projeye sahip olmak, bu senaryoda aynı UnityContainer'ı kullanmak için, UnityContainer'ınızı içeren bir "ortak" projeye ihtiyacınız var ve bunu diğer tüm projelere erişebilecekleri şekilde göstermeniz gerekir.

yani

WPF Projesi

Sınıf Kitaplığı 1

Sınıf Kitaplığı 2

Sınıf Kitaplığı 3

Ortak Kütüphanesi (UnityContainer burada yaşıyor)

dairesel önlemek için proje bağımlılıkları Çalışma zamanı yapılandırması yerine (örnekte bulunduğunuz gibi) Unity design-time configuration via a configuration file kullanmanızı öneririm. Aksi takdirde Ortak Kitaplığınız, çözümlediği tüm türleri içeren projelere başvuruda bulunacak ve bu projeler, Ortak Kütüphane'ye (muhtemelen UnityContainer örneğini ifşa edeceğiniz yer olduğundan) bağlı olacaktır. Çalışma zamanı yapılandırmasını kullanarak çalışmaya başlayabilirsiniz, ancak bunu denemedim; Tasarım zamanı yapılandırmasının, tam olarak böyle bir model kullanarak birkaç proje yaptığım için çalıştığını biliyorum.

+0

Teşekkürler Chris, bir deneyecek! –