2010-11-18 30 views
2

Aşağıdaki gibi ICatBase ve ICatExtension'dan türetilmiş bir arabirim ICatımız olduğunu varsayalım. Hem farklı arayüzler için, bir uygulama mevcuttur, CatBase ve CatExtension. Castle'ın DynamicProxy'si bunları bir ICat örneğinde birleştirmek için nasıl kullanılabilir?Birden çok sınıfla birden çok arabirim DynamicProxy kullanılarak nasıl birleştirilebilir?

ICatExtension'ın CatExtension tarafından uygulandığı ve ICatBase'in bir engelleyici tarafından 'uygulanacağı' bir proxy oluşturmak mümkün mü? Bu nasıl başarılabilir?

public interface ICatBase 
{ 
    string Name { get; set; } 
    int Age { get; set; } 
} 

public interface ICatExtension 
{ 
    string Description { get; } 
} 

public interface ICat : ICatBase, ICatExtension 
{ 
} 

public class CatBase : ICatBase 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class CatExtension : ICatExtension 
{ 
    public string Description 
    { 
     get { return "Furry"; } 
    } 
} 

Bu işi yapmak için katmalar kullanmaya çalışıyorlar

DÜZENLEME ama NotImplementedException sonuçları aşağıda kodu.

var generator = new ProxyGenerator(); 
var options = new ProxyGenerationOptions(); 
options.AddMixinInstance(new CatBase()); 
options.AddMixinInstance(new CatExtension()); 
var cat = generator.CreateInterfaceProxyWithoutTarget<ICat>(options);   
cat.Name = "Joey"; 

Bu

bir DynamicProxy2 hatadır: yöntemi için belirtilen önleyicilerin vardır 'Boşluk set_Name (System.string)' bir hedef vardır. Hedefsiz bir yöntem çağrıldığında, 'devam etmek' için bir uygulama yoktur ve uygulamayı taklit etmek için önleyicinin sorumluluğundadır (geri dönüş değeri, çıkış argümanları vb.)

Aramaları ve gönderimleri engelleyen özel bir engelleyici oluşturabilirim Doğru arayüze, ama daha kolay/daha iyi bir yol olması gerektiğini hissediyorum. Doğrumuyum?

DÜZENLEME # 2

, Krzysztof'u teşekkür ederiz! Aşağıdaki satırları kullanarak çözüm oldu.

var generator = new ProxyGenerator(); 
var options = new ProxyGenerationOptions(); 
options.AddMixinInstance(new CatBase()); 
options.AddMixinInstance(new CatExtension()); 

var cat = (ICat)generator.CreateClassProxyWithTarget(typeof(object), new[] { typeof(ICat)}, new object(), options); 

DÜZENLEME # 3

bir son adım olarak, bu örnekten elde edilen proxy oluşturmak için bir Windsor kabı yapılandırılmış olur. Bunu yapabilmemin tek yolu, bir "Cat" isminin belirtilmesi ve daha sonra ICat ara yüzüne ismini belirterek ve daha sonra da System.Object örneğinin çözümlenmesiydi.

WindsorContainer container = new WindsorContainer(); 
container.Register(
    Castle.MicroKernel.Registration.Component.For<object>(). 
     Named("Cat"). 
     Proxy.AdditionalInterfaces(typeof (ICat)). 
     Proxy.MixIns(new CatBase()). 
     Proxy.MixIns(new CatExtension()) 
    ); 

var cat = (ICat)container.Resolve(typeof(object), "Cat"); 

Sadece belirli bir isme atıfta bulunmadan, bir iCAT örneği için konteyner sorabilir hangi buna daha şık bir yolu var mı?

+0

Henüz herhangi bir yerde belgelenmiş olup olmadığını hatırlamıyorum, ancak doğru davranışı görüyorsunuz. Hiçbir hedefi olmayan ICat, karışımlarınıza göre önceliklidir. Nasıl çalıştığını görün: http://issues.castleproject.org/issue/DYNPROXY-96 –

+0

Tamam, yani 'ICat' arabirimi hedef veya karışımlardan biri tarafından gerçekleştirilmiş olmalıdır. Ama bu aslında iki arayüzün birleşmesini engellemiyor mu? I gönderilir uygulama ('ICatBase') bir parçası, bir hedef/mixin ve (ICatExtension'') diğer sevk edilir (ICatBase' ve 'ICatExtension' 'birleştirilmiş) ICat'' bir örneğini istiyorum Başka bir örnek. Daha spesifik olarak, "ICatExtension" için bir uygulama sağlayacağız ve "ICatBase" otomatik olarak bir önleme cihazıyla oluşturulmalıdır. – Ringo

+0

Hayır, sadece hedefin karışımlara göre öncelikli olduğu anlamına gelir. Sadece bu arayüzü hedefiniz yapma. System.Object' için sınıf proxy'si oluşturun ve proxy'ye ek bir arayüz olarak bu arabirime atlayın, bu şekilde en düşük önceliğe sahip olacak ve çağrılar –

cevap

1

Karışımlar normalde bunun için kullanırlar.

+0

İşaretçi için teşekkürler.Gönderiyi düzenledim ve biraz rehberlik yapabilirim. – Ringo

İlgili konular