2013-06-11 26 views
5

'daki tüm örnekleri nasıl sıfırlanır MVVM Light framework kullanarak bir C# WPF Uygulaması yaptım. Uygulamam çalışma zamanı sırasında görünüm modülleri bulmak için ViewModelLocator sınıfını kullanır. ViewModelLocator, MVVM Light framework ile birlikte gelen SimpleIoc sınıfının kullanımını sağlar.IOC Container

İşte benim senaryo: Kullanıcı günlükleri bir uygulamayı kullanabilir. Çıkışta, bir sonraki kullanıcıya temiz bir ortam sağlamak için tüm viewmodel örneklerini elden çıkarmak/sıfırlamak/yeniden oluşturmak istiyorum.

ViewModelLocator sınıfında Cleanup() yöntemini uygulamaya çalıştım ancak çalışmıyor. Çalışmıyorsa, (ikinci) kullanıcının daha önce giriş yapmış olan kullanıcıdan verileri gördüğü anlamına gelir.

ilk deneme:

public static void Cleanup() 
{ 
    SimpleIoc.Default.Reset(); 
} 

ikinci deneyin:

public static void Cleanup() 
{ 
    SimpleIoc.Default.Unregister<LoginViewModel>(); 
    SimpleIoc.Default.Unregister<TaskViewModel>(); 

    SimpleIoc.Default.Register<LoginViewModel>(); 
    SimpleIoc.Default.Register<TaskViewModel>(); 
} 

üçüncü deneme (geçici bir çözüm istediğim ama öyle değil):

public static void Cleanup() 
{ 
    // I implemented the ICleanup interface in my viewmodels 
    // The cleanup method clears all my variables eg: myCollection.clear(); 
    SimpleIoc.Default.GetInstance<LoginViewModel>().Cleanup(); 
    SimpleIoc.Default.GetInstance<TaskViewModel>().Cleanup(); 
} 

i tüm sıfırlayabilirim nasıl benim ViewModelLocator sınıfındaki örnekler? Gerekirse daha gelişmiş bir Ioc Container kullanmaya hazırım. Ile

+0

Üçüncü yaklaşımın nesi yanlış? Nesneler tekrar kullanılamaz mı? – Romoku

+0

Geçerli kullanıcı için bazı şeyler hazırlayan kurucularda bazı mantık var. Bu artık çalışmayacak. Ayrıca bakılması gereken çok fazla kod yazmam gerekiyor (her viewmodel için temizleme yöntemi). Eski örnekleri atma yaklaşımı benim için çok daha basit görünüyor. – Joel

+0

MVVM Light sürdürücüsüne göre, bu önerilen yaklaşımdır. [SimpleIoc - gerekli her zaman yeni bir örnek sağlayabilir mi?] (Http://stackoverflow.com/a/9350917/580951). Bu, mimarinize uymuyorsa, başka bir IOC'ye geçmek daha iyi olabilir. – Romoku

cevap

4

SimpleIoC

Ben

private static string _currentKey = System.Guid.NewGuid().ToString(); 
public static string CurrentKey { 
    get { 
    return _currentKey; 
    } 
    private set { 
    _currentKey = value; 
    } 
} 

gibi benzersiz Key

şey için özel dize arka uç sahip bir kamu statik özellik ekleyip akımla VM en kaydını silmek temizleme yöntemi olurdu

tuşuna basın ve son olarak geçerli anahtarı sıfırlayın (her uygulama sıfırlama aşamasında çağır):

public static void Cleanup() { 
    SimpleIoc.Default.Unregister<LoginViewModel>(CurrentKey); 
    ... 
    CurrentKey = System.Guid.NewGuid().ToString(); 
} 

ve GetInstance(...) numaralı telefonu arayarak yalnızca CurrentKey numaralı statik iletiyi geçirin.

SimpleIoc.Default.GetInstance<LoginViewModel>(ViewModelLocator.CurrentKey); 
+0

benim için çalıştı, ancak yine de IOC Kapsayıcısını değiştirmeyi tercih ediyorum. Yine de bu bir çalışma çözümü ve bu nedenle doğru cevaptır. – Joel

+0

@ IoC konteynerini daha ayrıntılı bir şekilde değiştirmeyi tercih ederseniz, örneklerinizi 'ExternallyControlledLifetimeManager' olarak verebileceğiniz Unity'yi kullanabilirsiniz; bu, yalnızca GC çöplüğünün VM'in örneğini hiçbir şey almazken Sanal Makinenin örneğini toplamasına izin verir. çıkışınızdan sonra güçlü referans.Nesnelerinizin Yaşam süresini yönetmek için birkaç tane daha Yöneticiniz var. Ancak, bu – Viv

+0

ile ilgili olarak SimpleIoC'de kesinlikle bir yanlışlık yok, evet şimdi Unity'yi kullanıyorum. Bu doğru ya da yanlış değildi, sadece 'SimpeIoC' tüm ihtiyaçlarıma uymuyordu. – Joel