2012-07-10 13 views
5

मैं एक बहु-किरायेदार वेब ऐप (ढेर: एमवीसी 4 + इकाई फ्रेमवर्क 4.3) विकसित कर रहा हूं। मेरी आवश्यकताएं बहुत सरल हैं: प्रत्येक किरायेदार के पास एक ही यूआई और कोडबेस होता है।इकाई ढांचे के साथ एक साधारण बहु किरायेदार वेब अनुप्रयोग के लिए समाधान

मेरे डेटाबेस में मेरे पास TenantId फ़ील्ड (और बिना अन्य टेबल) के साथ कुछ टेबल हैं।

public class GenericRepository<TEntity> where TEntity : class 
{ 
    internal Database.CRMEntities context; 
    internal DbSet<TEntity> dbSet; 
    internal int tenantId; 

    public GenericRepository(Database.CRMEntities context) 
    { 
     this.context = context; 
     this.dbSet = context.Set<TEntity>(); 
     this.tenantId = 1; 
    } 

मैं "मिल" तरीकों चाहते हैं मेरी tenantId के लिए फिल्टर करने के लिए:

मैं एक बहुत ही सरल सामान्य भंडार की स्थापना की है। मेरी डालने, अपडेट करने और हटाने की विधि को TenantId को विनियमित करना चाहिए।

मेरी संस्थाएं पीओसीओ कक्षाओं को स्वत: उत्पन्न कर रही हैं।

मैं इन समाधानों पर विचार किया है:

1- GenericRepository एक "ITenant" इंटरफेस है कि TenantId को परिभाषित करता है को लागू करना चाहिए। समस्या यह है कि कुछ संस्थाओं को TenantId संपत्ति नहीं मिली है। इसके अलावा, मैं वास्तव में (लेकिन निश्चित रूप से एफई एक एसक्यूएल बयान में अनुवाद नहीं कर सकता)

उन्हें अपने इंटरफ़ेस को लागू

2- प्रतिबिंब बनाने के लिए मैं POCO वस्तुओं उत्पन्न करने के लिए का उपयोग टी -4 टेम्पलेट संशोधित करना पसंद नहीं है

if (typeof(TEntity).GetProperty("TenantId") != null) 
      query = query.Where(x => (int) (x.GetType().GetProperty("TenantId").GetValue(x, null)) == tenantId); 

मेरे मामले में आप क्या करेंगे? यदि आवश्यक हो तो मैं अपने वास्तुकला पर पुनर्विचार करने के लिए तैयार हूं।

धन्यवाद, निकॉला

उत्तर

5

आप प्रतिबिंब की जांच कर सकते हैं और फिर मैन्युअल रूप से एक अभिव्यक्ति पेड़ कि एफई समझ सकते हैं पैदा करते हैं।

उदाहरण के लिए:

int tenantId = 5; 

var tenantIdInfo = typeof(TEntity).GetProperty("TenantId"); 

if (tenantIdInfo != null) 
{ 
    var entity = Expression.Parameter(typeof(TEntity), "it"); 

    var predicate = (Expression<Func<TEntity, bool>>)Expression.Lambda(
     Expression.Equal(
      Expression.MakeMemberAccess(entity, tenantIdInfo), 
      Expression.Constant(tenantId, typeof(int))), 
     entity); 

    query = query.Where(predicate); 
} 
+0

जवाब के लिए धन्यवाद। एक अभिव्यक्ति काम करनी चाहिए ... और जटिल समस्या का प्रबंधन करने के लिए यह कोड का एक बहुत ही सरल टुकड़ा है। मैं सोच रहा था ... प्रतिबिंब "धीमा" है या मैं बिना किसी समस्या के इसका उपयोग कर सकता हूं? –

+0

प्रतिबिंब प्रदर्शन पर काफी प्रभाव डालता है, लेकिन आपको यह देखने के लिए अपने विशिष्ट परिदृश्य के लिए इसे मापने की आवश्यकता होगी कि यह स्वीकार्य है या नहीं। –

+0

मैंने कुछ परीक्षण चलाए: एक चयन क्वेरी 1000 बार दोहराई गई और केवल एक पंक्ति लौटने से लगभग 5% धीमी हो गई। यह एक पूर्ण परीक्षण नहीं है, लेकिन अभी के लिए पर्याप्त है। मैं अपने प्रश्न को उत्तर के रूप में चिह्नित कर रहा हूं अगर कोई भी कुछ दिनों में बेहतर विचार के साथ आता है। धन्यवाद! –

संबंधित मुद्दे