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) Users
2)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 GetProjectUsers
ve bu, bir veri ızgarasında veya benzerinde gösterilecek yeterli bilgiye sahip nesneleri geri verir.
Sorun:
İdeal olarak, Projects
alt 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 GetUser
için Users
sistemi çağırması gerekir . Ancak, bu GetUser
, User
alt 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 Projects
sadece yapabileceği JOIN
tek sorguda tüm proje kullanıcılarını alır. Projects
ayrıca User
sorgu 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 GetUser
görüşmelerden kaçınırken ayrılığı korumanın bir yolunu önerebilir GetProjectUsers
mi?
Ö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.