ऊपर सूचीबद्ध अन्य कारणों के अलावा, एक और कारण है कि मैं न केवल नेस्टेड कक्षाओं का उपयोग करने के बारे में सोच सकता हूं, लेकिन वास्तव में सार्वजनिक नेस्टेड कक्षाएं। जो एक ही सामान्य प्रकार के मापदंडों को साझा करने वाले कई सामान्य वर्गों के साथ काम करते हैं, उनके लिए जेनेरिक नेमस्पेस घोषित करने की क्षमता बेहद उपयोगी होगी। दुर्भाग्य से, .Net (या कम से कम C #) जेनेरिक नेमस्पेस के विचार का समर्थन नहीं करता है। तो उसी लक्ष्य को पूरा करने के लिए, हम उसी लक्ष्य को पूरा करने के लिए जेनेरिक कक्षाओं का उपयोग कर सकते हैं। तार्किक इकाई से संबंधित निम्नलिखित उदाहरण कक्षाएं लें:
public class BaseDataObject
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public class BaseDataObjectList
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
:
CollectionBase<tDataObject>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public interface IBaseBusiness
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
public interface IBaseDataAccess
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : BaseDataObject<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataObjectList : BaseDataObjectList<tDataObject, tDataObjectList, tBusiness, tDataAccess>, new()
where tBusiness : IBaseBusiness<tDataObject, tDataObjectList, tBusiness, tDataAccess>
where tDataAccess : IBaseDataAccess<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
}
हम एक सामान्य नाम स्थान (नेस्टेड कक्षाओं के माध्यम से कार्यान्वित) का उपयोग करके इन वर्गों के हस्ताक्षर को सरल बना सकते हैं:
public
partial class Entity
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
where tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
where tBusiness : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
where tDataAccess : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{
public class BaseDataObject {}
public class BaseDataObjectList : CollectionBase<tDataObject> {}
public interface IBaseBusiness {}
public interface IBaseDataAccess {}
}
फिर, एक पूर्व टिप्पणी में एरिक वैन ब्राकेल द्वारा सुझाए गए आंशिक कक्षाओं के उपयोग के माध्यम से, आप कक्षाओं को अलग-अलग नेस्टेड फ़ाइलों में अलग कर सकते हैं। मैं आंशिक वर्ग फ़ाइलों को घोंसले के शिकार करने के लिए NestIn की तरह एक Visual Studio एक्सटेंशन का उपयोग करने की सलाह देता हूं। यह "नेमस्पेस" क्लास फाइल्स को नेस्टेड क्लास फाइल्स को फोल्डर में व्यवस्थित करने के लिए भी इस्तेमाल किया जा सकता है।
उदाहरण के लिए:
Entity.cs
public
partial class Entity
<
tDataObject,
tDataObjectList,
tBusiness,
tDataAccess
>
where tDataObject : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObject
where tDataObjectList : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.BaseDataObjectList, new()
where tBusiness : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseBusiness
where tDataAccess : Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>.IBaseDataAccess
{
}
Entity.BaseDataObject.cs
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public class BaseDataObject
{
public DataTimeOffset CreatedDateTime { get; set; }
public Guid CreatedById { get; set; }
public Guid Id { get; set; }
public DataTimeOffset LastUpdateDateTime { get; set; }
public Guid LastUpdatedById { get; set; }
public
static
implicit operator tDataObjectList(DataObject dataObject)
{
var returnList = new tDataObjectList();
returnList.Add((tDataObject) this);
return returnList;
}
}
}
Entity.BaseDataObjectList.cs
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public class BaseDataObjectList : CollectionBase<tDataObject>
{
public tDataObjectList ShallowClone()
{
var returnList = new tDataObjectList();
returnList.AddRange(this);
return returnList;
}
}
}
Entity.IBaseBusiness.cs
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public interface IBaseBusiness
{
tDataObjectList Load();
void Delete();
void Save(tDataObjectList data);
}
}
Entity.IBaseDataAccess.cs
partial class Entity<tDataObject, tDataObjectList, tBusiness, tDataAccess>
{
public interface IBaseDataAccess
{
tDataObjectList Load();
void Delete();
void Save(tDataObjectList data);
}
}
विज़ुअल स्टूडियो सॉल्यूशन एक्सप्लोरर की फाइलों को फिर इस तरह व्यवस्थित किया जाएगा:
Entity.cs
+ Entity.BaseDataObject.cs
+ Entity.BaseDataObjectList.cs
+ Entity.IBaseBusiness.cs
+ Entity.IBaseDataAccess.cs
और आप निम्नलिखित की तरह सामान्य नामस्थान लागू करेंगे:
User.cs
public
partial class User
:
Entity
<
User.DataObject,
User.DataObjectList,
User.IBusiness,
User.IDataAccess
>
{
}
User.DataObject.cs
partial class User
{
public class DataObject : BaseDataObject
{
public string UserName { get; set; }
public byte[] PasswordHash { get; set; }
public bool AccountIsEnabled { get; set; }
}
}
User.DataObjectList.cs
partial class User
{
public class DataObjectList : BaseDataObjectList {}
}
User.IBusiness.cs
partial class User
{
public interface IBusiness : IBaseBusiness {}
}
User.IDataAccess.cs
partial class User
{
public interface IDataAccess : IBaseDataAccess {}
}
और फाइलों को हल एक्सप्लोरर में व्यवस्थित किया जाएगा:
User.cs
+ User.DataObject.cs
+ User.DataObjectList.cs
+ User.IBusiness.cs
+ User.IDataAccess.cs
उपरोक्त एक सामान्य नेमस्पेस के रूप में बाहरी वर्ग का उपयोग करने का एक सरल उदाहरण है। मैंने "जेनेरिक नेमस्पेस" बनाया है जिसमें पूर्व में 9 या अधिक प्रकार के पैरामीटर हैं। उन प्रकार के मापदंडों को पूरे नौ प्रकारों में समकालिक रखने के लिए, जो सभी प्रकार के मापदंडों को जानने के लिए आवश्यक थे, विशेष रूप से एक नया पैरामीटर जोड़ते समय थकाऊ था। जेनेरिक नामस्थान का उपयोग उस कोड को अधिक प्रबंधनीय और पठनीय बनाता है।