2011-09-21 34 views
7

Aynı arabirimin 2 uygulamasına sahibim ve kullanıcı oturum açmışsa veya kullanıcı oturum açmamışsa, uygulama1'i kullanmak istiyorum1 Kullanıcı bunu kale windsor ile nasıl yapılandırabilirim?Castle windor Koşullu bağımlılık ekleme

cevap

1

Bunu çözmenin bir yolu, hizmeti anahtarla kaydettirin ve sonra gerektiği gibi çözün.

public interface ISample 
{ 
    int Calculate(int a, int b); 
} 

class SampleB : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b + 10; 
    } 
} 

class SampleA : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b; 
    } 
} 

kayıt: SampleA gerektiğinde

 container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient); 
     container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient); 

// çözün. SampleB gerektiğinde özünür.

var sampleB = container.Resolve<ISample>("SampleB"); 
+1

Burada container.Resolve() 'yi çağırırdınız? –

+0

İçerideki uygulamayı değiştirmedikçe/genişletmediğiniz sürece, windsor'un kullanıcının giriş yaptığını bilmesinin ya da bulunmasının bir yolu yoktur. Aralarında “log in factor” alacak ve istenen uygulamayı verecek bir Decider sınıfı olabilir. –

+0

Windsor * bunun için mekanizmalara sahiptir (mookid'in cevabına bakınız), kendi iç uygulamasını hiç değiştirmemize gerek yoktur. –

7

Kullanılabilir uygulamalar örneğin bağlı arasında seçim yapmak mümkün olacaktır bir handler selector, ekleyebilir Thread.CurrentPrincipal'un ayarlanıp ayarlanmadığı (veya doğru hatırlıyorsa ASP.NET/MVC'de HttpContext.Current.Request.IsAuthenticated). işleyici seçici muhtemelen bu benzeyecektir

:

public class MyAuthHandlerSelector : IHandlerSelector 
{ 
    public bool HasOpinionAbout(string key, Type service) 
    { 
     return service == typeof(ITheServiceICareAbout); 
    } 

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) 
    { 
     return IsAuthenticated 
      ? FindHandlerForAuthenticatedUser(handlers) 
      : FindGuestHandler(handlers); 
    } 

    bool IsAuthenticated 
    { 
     get { return Thread.CurrentPrincipal != null; } 
    } 
    // .... 
} 
işleyicisi seçiciler

Sadece olumsuz, onlar kaptan çekti değiliz ki - onlar kayıt esnasında kaba bir örneği olarak eklenir yani zaman, böylece bağımlılık enjekte, yaşam tarzı yönetilen, vb almak zorunda değilsiniz, ama bunu azaltmak için yollar var - bunun nasıl yapılacağını görmek istiyorsanız F.T.Windsor bir göz atın.

+1

3.0 sürümü ile bir şey değişmiş olup olmadığını merak ediyorum - eğer hala harici bir tesis gerekiyorsa demek istiyorum. – Giedrius

İlgili konular