سلام
من دقیق متوجه ی عملکردتون نشدم و بخشی از کدها هم توی عکس فرستادین .
اما مشکلی نیست . خوب توی همون رویداد خاص ، عملیات مربوط به همون کاری که مد نظرتون هست را فراخوانی و اجرا کنین دیگه .
---------
در کدتون که ساختار عملیاتی تون مشخص نیست .
1 - مثلا در کدتون به نظر میرسه که یک کلاس ViewModel (در لایه ی ViewModel) با نام MainWindowViewModel داشته باشین . اگه این طور باشه ، حداقل به نظر من ، این ساختار درست نیست که به ازای یک Window ، بیاین یه ViewModel تعریف کنید . ViewModel ها باید به ازای هر ماژول ای که در لایه ی Model تعریف میشن ، تعریف بشن .
مثلا اگر در Model ، 2 ماژول برای کار با ماژول اصلی برنامه تون که فرضا ماژول "انبارداری" و همچنین ماژول "اعتبارسنجی داده ها" دارین ، در ViewModel هم معمولا 2 تا به ازای هر کدوم از اونها درست میکنن (گاها ممکنه به ازای چند ماژول ، فقط یک ViewModel درست بشه) .
2 - باز هم به نظر میرسه که در ViewModel (در سازنده ی ItemViewModel) ، شی ای از Repository ها دریافت کرده باشین را از لایه ی View دریافت کرده باشین (نوع IAsyncRepository<T>) .
اگر این طور باشه ، کلا معماری لایه ای را نقض کردین (نه فقط MVVM را) چون Repository که حداقل در لایه ی Model قرار میگیره و View نمیتونه شی ای از لایه ی Model را در اختیار ViewModel بذاره یا ازش بگیره . اگر بقیه ی انواع داده ای که در اون سازنده ها هستند هم همین روال را داشته باشند هم ، همین داستان براشون برقرار هست .
در هر معماری لایه ای ، فقط (کلاس های) لایه ی قبلی میتونه برای (کلاس های) لایه ی بعدی ، داده ارسال و ازش دریافت کنه .
لایه ی بعدی هم اگه اطلاعاتی بخواد به لایه ی قبلی بفرسته ، یا باید توسط متد بازگشتی ، یا باید توسط رویداد و یا Binding باشه . یعنی لایه ی بعدی (مثل Model) ، نمیتونه از لایه ی قبلی (مثل ViewModel) ، شی بسازه یا به کلاس هایی که در لایه ی قبلی تعریف میشه ، دسترسی داشته باشه .
3 - Dependency Injection به این معنا نیست که شی ای از لایه بعدی (مثل Model) را از
دو لایه ی قبلی (مثل View) دریافت کنید (وگرنه کلا معماری لایه ای ، نقض میشه) .
بلکه به این معناست که
نهایتا فرضا شی ای از کلاس های لایه ی بعدی را از لایه ی قبلی دریافت کنید . حتی میتونه ربطی به این هم نداشته باشه و از کلاس هایی که در همون لایه هستند ، دریافت کنید .
ضمنا ، به نظرم الگوی طراحی ای که جایگزین خوبی برای Dependency Injection باشه ، الگوی طراحی Factory Method یا Service Locator هستند .
میتونید در همون ماژول ای که اینترفیسی را برایش طراحی میکنید ، یک کلاسی (فرضا بنام ServiceLocator) بسازید که شی ای از یک کلاسی که اون اینترفیس درون اون ماژول را پیاده سازی میکنند ، بسازه .
بعد هم در لایه و یا در ماژول دیگه ای که میخواین از این ماژول استفاده کنین ، نوع داده ای را از نوع اینترفیس و شی را از متدی از کلاس ServiceLocator بگیرین که شی ای از کلاس های اون ماژول را برمیگردوند :
//Modual Test
public interface ITest
{
}
public class TestA
{
}
public class TestB
{
}
//ServiceLocator
public class ServiceLocator
{
public static ITest GetTestA()
{
return new TestA();
}
}
// Other Modual
public class Use
{
private void Name()
{
ITest test = ServiceLocator.GetTestA();
}
}
کدهای کامل و کلا درباره ی این الگوهای طراحی میتونید در اینترنت جستجو کنید .
4 - برای رعایت اصل SRP در Solid ، همه ی کارها را درون یک متد (و حتی یک کلاس) انجام ندید . متد سازنده تون ، پر از کارهای مختلف هست . از مقداردهی اولیه ، تا شی سازی Command ها و ... . حداقل شی سازی Command را در متد مجزا بنویسید و در متد سازنده فراخوانی کنید .
5 - در عکس دوم ، مقداردهی IsLoading چرا در نخ جدید ، اون هم با توقف 1 ثانیه انجام گرفت؟!
نخ جدید را معمولا برای کارهای سنگین ، یا کاری که UI را منتظر نذاره ، انجام میدن . به نظر میرسه که این کدتون در نخ جدید ، روی هیچ کدوم از این نوع کارها تاثیری نداره .