इस तथ्य के बावजूद कि मैं थोड़ी देर के लिए यहां रहा हूं, यह एसओ पर मेरा पहला सवाल है, इसलिए कृपया मेरे साथ सौम्य रहें।क्या बेस कंट्रोलर एएसपी.नेट एमवीसी 3 में यह कस्टम प्रधानाचार्य बहुत अक्षम है?
मैं ASP.NET MVC 3
का उपयोग कर रहा हूं और मैं एक कस्टम Principal
बनाना चाहता हूं, इसलिए मैं मानक उपयोगकर्ता की तुलना में वर्तमान उपयोगकर्ता के बारे में थोड़ी अधिक जानकारी स्टोर कर सकता हूं, इस प्रकार डेटाबेस को अक्सर नहीं जाना पड़ता है। यह काफी मानक सामान है जो मैं कर रहा हूं। आइए पहले उदाहरण में ईमेल पता और उपयोगकर्ता आईडी कहें।
मैंने ऑब्जेक्ट को कैश में स्टोर करने का निर्णय लिया है क्योंकि मुझे पता है कि इसे सत्र में संग्रहीत करने की सलाह नहीं दी जाती है।
मैं भी User
ऑब्जेक्ट कास्टिंग रखना नहीं चाहता, इसलिए मैं नियंत्रक में User
ऑब्जेक्ट को ओवरराइड करना चाहता था। तो मैं बस User.UserId
जा सकता हूं और कुछ की गारंटी हो सकता हूं।
तो मैं इस तरह एक कस्टम प्रिंसिपल बनाया:
public class MyPrincipal : IPrincipal
{
public MyPrincipal(IIdentity ident, List<string> roles, string email, Guid userId)
{
this._identity = ident;
this._roles = roles;
this._email = email;
this._userId = userId;
}
IIdentity _identity;
public IIdentity Identity
{
get { return _identity; }
}
private List<string> _roles;
public bool IsInRole(string role)
{
return _roles.Contains(role);
}
private string _email;
public string Email
{
get { return _email; }
}
private Guid _userId;
public Guid UserId
{
get { return _userId; }
}
}
और मैं इस तरह की एक बेस नियंत्रक है:
public class BaseController : Controller
{
protected virtual new MyPrincipal User
{
get
{
if (base.User is MyPrincipal)
{
return base.User as MyPrincipal;
}
else
{
return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty);
}
}
}
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (User != null)
{
if (User.Identity.IsAuthenticated)
{
if (User.Identity is FormsIdentity)
{
FormsIdentity id = base.User.Identity as FormsIdentity;
MyPrincipal principal = (MyPrincipal)filterContext.HttpContext.Cache.Get(id.Name);
if (principal == null)
{
MembershipUser user = Membership.GetUser();
// Create and populate your Principal object with the needed data and Roles.
principal = new MyPrincipal(id, Roles.GetRolesForUser(id.Name).ToList(), user.Email, (Guid)user.ProviderUserKey);
filterContext.HttpContext.Cache.Add(
id.Name,
principal,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
new System.TimeSpan(0, 30, 0),
System.Web.Caching.CacheItemPriority.Default,
null);
}
filterContext.HttpContext.User = principal;
System.Threading.Thread.CurrentPrincipal = principal;
base.OnAuthorization(filterContext);
}
}
}
}
}
आप एक नजर है, तो आप जल्दी से एहसास होगा उपयोगकर्ता है कि अगर में लॉग इन नहीं किया गयाUser
ऑब्जेक्ट पर कॉल करें इस कोड को कोड के माध्यम से चलाने के लिए होगा:
return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty);
और यह मेरे लिए बहुत अक्षम है, हालांकि यह केवल गायब सामान के लिए खाली वस्तुओं को बना रहा है।
यह ठीक काम करता है।
तो मुझे लगता है कि मैं जानना चाहता हूं कि यह वास्तव में ठीक है या नहीं और मुझे प्रदर्शन और दक्षता के बारे में इतना गुदा होना बंद करना चाहिए, या यदि मेरे डर सही हैं, तो इस मामले में मुझे इसके बजाय क्या करना चाहिए? [कृपया यह न कहें "जीवन प्राप्त करना, दोस्त!"]
मत भूलना [नुथ] (http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize) ... "समय से पहले अनुकूलन सब बुराई की जड़ है।" यही कहना है, क्या आपने वास्तव में प्रदर्शन के मुद्दों को देखा है? –
+1 अच्छा है। नहीं मैंने नहीं किया है।लेकिन बात यह है कि जब तक मैंने कोड की उस ग़लत रेखा को नहीं देखा, तब तक मैं इसे सब काम करने में बहुत स्मार्ट महसूस कर रहा था! वाह! मैं वास्तव में गुदा हूँ! मुझे लगता है कि बीबीसी माइक्रो पर कोडिंग शुरू करने की बात आती है, जहां घड़ी चक्र कुछ और बहुत दूर थे ... –