C# uygulamasındaki server.exe
benim iş operasyonları için kritik öneme sahiptir ve ideal olarak 7/24 kesintisiz çalışmalıdır. Kod, sağlam bir katıdır ancak kontrolüm dışında kalan bir şey, üçüncü taraflarca üretilen gelen veri feed'lerinin kalitesizliğidir. Bazen bu sana mecbur durumda anormallikleri içeren veri beslemeleri alırsınız: server.exe
içinde yem işleme kodu, yeni kodu kullanarak anomaliyi C# uygulamamın bir bölümünü, uygulamanın yeniden başlatılmadan dinamik olarak yüklenmesini nasıl sağlayabilirim?
server.exe
karşılamak için
- güncelleme ve sözdizimsel izin kusurlu yem
tüm süreç genellikle birkaç dakika ama server.exe
yeniden başlatılmasına daha az sürer belli olmayan kritik durum bilgilerinin sıfırlama neden olur işlenecek ve daha da kötüsü, server.exe.
Benim gol bağlı harici süreçlerin bir bozulmaya neden olur: içerikleri server.exe
yeniden başlatmadan güncellenebilir ayrı DLL içine yem işleme kodunu izole edin. Bunu nasıl yaparım?
beni şimdiye kadar öncesinde bu forumu yazı yazmaya ne yaptık açıklamaya izin ver:
besleme işlemci arayüzü common.dll
adlı yeni meclise taşındı.
public interface IFeedProcessor{
bool ProcessFeed(String filePath); //returns false on failure, true on success
}
Server.exe
şimdi common.dll
başvuruyor: arayüz şuna benzer.
Yem işlemcileri, feedProcessors.dll
adı verilen yeni bir gruba taşındı.
internal class FeedProcessor1:IFeedProcessor{
public FeedProcessor1(){}
bool ProcessFeed(String filePath){/*implementation*/return true;}
}
internal class FeedProcessor2:IFeedProcessor{
public FeedProcessor2(){}
public bool ProcessFeed(String filePath){/*implementation*/return true;}
}
[... and so on...]
feedProcessors.dll
da bazı yapılandırma girişlerine dayalı olarak belirli bir besleme işlemci oluşturmak için kullanılan FeedProcessorUtils
adında bir sınıf içerir: uygulamaları şuna benzer. Şöyle bir şeye benziyor:
public class FeedProcessorUtils{
public static void CreateFeedProcessor(int feedType /*and other configuration params*/){
switch(feedType){
case 1:return new FeedProcessor1();
case 2:return new FeedProcessor2();
default: throw new ApplicationException("Unhandled feedType: "+feedType);
}
}
}
Her şey daha önce olduğu gibi çalışıyor ancak elbette dinamik yükleme problemimi çözmüyor; feedProcessors.dll
'u yeni kodla güncelleştirip üretim sunucusuna kopyaladım, dosya kullanımda olduğundan bunu yapamıyorum. Orada sürpriz yok. Peki çözüm nedir?
İdeal olarak, bir dosya kullanım hatası olmadan ve server.exe
yeniden başlatılmadan, güncelleştirilmiş bir feedProcessors.dll
üretim sunucusuna kopyalamak mümkün olmak istiyorum. Sonra, bir sonraki sefer server.exe
FeedProcessorUtils.CreateFeedProcessor() için bir çağrı yapar, eski yerine yerine revize DLL yürütüyor olacak.
Nereden başlarım?
[MEF] adlı kullanıcıyı arıyorsunuz (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) –