मेरा दृष्टिकोण आदर्श नहीं हो सकता है, लेकिन मुझे लगता है कि यह काफी अच्छी तरह से काम कर रहा है। मैंने जो किया वह मैंने किया - मैंने
का उपयोग करने का निर्णय नहीं लिया निर्भरता इंजेक्शन
वर्तमान उपयोगकर्ता को हर जगह सीधे पास कर दिया क्योंकि यह बहुत बोझिल हो रहा था और स्थिर संदर्भ में स्विच किया गया था। संदर्भों में समस्या - उन्हें प्रबंधित करना थोड़ा मुश्किल है।
यह एक अपने डोमेन में परिभाषित किया गया है:
public static class UserContext{
private static Func<User> _getCurrentUser;
private static bool _initialized;
public static User Current{
get{
if(!_initialized)
throw new Exception("Can i haz getCurrentUser delegate?");
var user=_getCurrentUser();
return user??User.Anonymous;
}
}
public static void Initialize(Func<User> getCurrentUser){
_getCurrentUser=getCurrentUser;
_initialized=true;
}
}
ध्यान दें कि प्रतिनिधि स्थिर है - पूरे अनुप्रयोग के लिए केवल एक समय में एक। और मैं इसके जीवन चक्र, संभावित मेमोरी लीक या व्हाट्नॉट के बारे में 100% निश्चित नहीं हूं।
क्लाइंट एप्लिकेशन संदर्भ आरंभ करने के लिए ज़िम्मेदार है। मेरे वेब एप्लिकेशन है जो करता है हर अनुरोध पर:
public class UserContextTask:BootstrapperTask{
private readonly IUserSession _userSession;
public UserContextTask(IUserSession userSession){
Guard.AgainstNull(userSession);
_userSession=userSession;
}
public override TaskContinuation Execute(){
UserContext.Initialize(()=>_userSession.GetCurrentUser());
return TaskContinuation.Continue;
}
}
धारा लाइन बूटस्ट्रैपिंग कार्यों के mvcextensions पुस्तकालय का उपयोग करना। आप इसके लिए global.asax में घटनाओं के अनुसार बस सदस्यता ले सकते हैं।
क्लाइंट साइड (वेब एप्लिकेशन) में, मैं आवेदन सेवा नामित IUserSession लागू:
public User GetCurrentUser(){
if(HttpContext.Current.User==null) return null;
var identity=HttpContext.Current.User.Identity;
if(!identity.IsAuthenticated) return null;
var user=_repository.ByUserName(identity.Name);
if(user==null) throw new Exception("User not found. It should be. Looks bad.");
return user;
}
वहाँ आदेश/ओ सदस्यता प्रदाता और भूमिका प्रदाता w भूमिकाओं के साथ रूपों प्रमाणीकरण का उपयोग करने के लिए कुछ और lame code आवश्यक है। लेकिन यह इस सवाल का मुद्दा नहीं है।
डोमेन स्तर पर - मैं स्पष्ट रूप से अनुमतियाँ उपयोगकर्ताओं इस तरह हो सकता है वर्णन कर रहा हूँ: - उन अनुमतियों और अधिक परिष्कृत किया जा सकता है
public class AcceptApplications:IUserRights{
public bool IsSatisfiedBy(User u){
return u.IsInAnyRole(Role.JTS,Role.Secretary);
}
public void CheckRightsFor(User u){
if(!IsSatisfiedBy(u)) throw new ApplicationException
("User is not authorized to accept applications.");
}
}
कूल बात है। उदाहरण के लिए:
public class FillQualityAssessment:IUserRights{
private readonly Application _application;
public FillQualityAssessment(Application application){
Guard.AgainstNull(application,
"User rights check failed. Application not specified.");
_application=application;
}
public bool IsSatisfiedBy(User u){
return u.IsInRole(Role.Assessor)&&_application.Assessors.Contains(u);
}
public void CheckRightsFor(User u){
if(!IsSatisfiedBy(u))
throw new ApplicationException
("User is not authorized to fill quality assessment.");
}
}
अनुमतियां विपरीत भी vica जाँच की जा सकती - उपयोगकर्ता इन दोस्तों है:
public virtual bool HasRightsTo<T>(T authorizationSpec) where T:IUserRights{
return authorizationSpec.IsSatisfiedBy(this);
}
public virtual void CheckRightsFor<T>(T authorizationSpec) where T:IUserRights{
authorizationSpec.CheckRightsFor(this);
}
यहाँ मेरी कुल जड़ आधार वर्ग है:
public class Root:Entity,IRoot{
public virtual void Authorize(IUserRights rights){
UserContext.Current.CheckRightsFor(rights);
}
}
और यहाँ है कि कैसे मैं अनुमतियों की जाँच करें:
public class Application{
public virtual void Accept(){
Authorize(new AcceptApplications());
OpeningStatus=OpeningStatus.Accepted;
}
}
मुझे उम्मीद है कि मदद करता है ...
मैं सिर्फ यह कहना चाहता था कि मेरे प्रश्न के साथ थोड़ा ओवरलैप है कि मैंने हाल ही में रेस्पोजिटरीज को उपयोगकर्ता संदर्भ के बारे में जागरूक होने की अनुमति देने के बारे में और पूछा है। मैं अन्य उपयोगकर्ता संदर्भ संवेदनशील मानों तक पहुंचने के लिए उपयोगकर्ता संदर्भ का उपयोग करने के मुद्दे के साथ इस समस्या को हल करने का प्रयास कर रहा हूं। http://stackoverflow.com/questions/5374176/can-ddd-repositories-be-aware-of-user-context – jpierson