Arka plan:
Bir sunucu uygulaması tasarlıyorum ve farklı alt sistemler için ayrı dll'ler oluşturuyorum. İşleri basitleştirmek için iki alt sistemim olduğunu varsayalım: 1) Users2)Projects
Kullanıcıların genel arayüzünün aşağıdaki gibi bir yöntemi vardır:
IEnumerable<User> GetUser(int id);
Ve Projects'in genel arayüzünün aşağıdaki gibi bir yöntemi vardır:
IEnumerable<User> GetProjectUsers(int projectId);
Örneğin, belirli bir proje için kullanıcıları göstermemiz gerektiğinde, arayabiliriz GetProjectUsersve bu, bir veri ızgarasında veya benzerinde gösterilecek yeterli bilgiye sahip nesneleri geri verir.
Sorun:
İdeal olarak, Projectsalt sistem de kullanıcı bilgilerini depolamamalı ve sadece bir projeye katılan kullanıcıların Kimlikleri'ni saklamalıdır. Sunmak için GetProjectUsers, kendi veritabanında saklanan her kullanıcı kimliği GetUseriçin Userssistemi çağırması gerekir . Ancak, bu GetUser, Useralt sistem içinde çok sayıda ayrı sql sorgusuna neden olan çok sayıda ayrı çağrı gerektirir . Bunu gerçekten test etmedim ama bu konuşkan tasarıma sahip olmak sistemin ölçeklenebilirliğini etkileyecek.
Ben kenara alt sistemlerin ayrılmasını koyarsanız, ben olabilir iki sistemde tek bir şema erişilebilir tüm bilgileri saklamak ve Projectssadece yapabileceği JOINtek sorguda tüm proje kullanıcılarını alır. Projectsayrıca Usersorgu sonuçlarından nasıl nesne üretileceğini de bilmelidir . Ancak bu, birçok avantajı olan ayrılığı kırar.
Soru:
Sırasındaki tüm bu bireysel GetUsergörüşmelerden kaçınırken ayrılığı korumanın bir yolunu önerebilir GetProjectUsersmi?
Örneğin, sahip olduğum bir fikir Kullanıcılar için harici sistemlere kullanıcıları bir etiket-değer çiftiyle "etiketleme" ve belirli bir değere sahip kullanıcılardan talep etme yeteneği vermekti.
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Ardından Projeler sistemi her kullanıcıyı projeye eklendikçe etiketleyebilir:
AddUserTag(userId,"project id", myProjectId.ToString());
ve GetProjectUsers sırasında, tüm proje kullanıcılarını tek bir çağrıda isteyebilir:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
emin değilim bölüm: evet, Kullanıcılar projelerin agnostik ama gerçekten proje üyeliği hakkında bilgi Projeler değil, Kullanıcılar sisteminde saklanır. Kendimi doğal hissetmiyorum, bu yüzden burada eksik olduğum büyük bir dezavantaj olup olmadığını belirlemeye çalışıyorum.