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
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");
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.
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
Burada container.Resolve() 'yi çağırırdınız? –
İç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. –
Windsor * bunun için mekanizmalara sahiptir (mookid'in cevabına bakınız), kendi iç uygulamasını hiç değiştirmemize gerek yoktur. –