मेरे पास एक वेबपीआई 2 सी # परियोजनाएं हैं जिन पर मेरे पास नियंत्रक फ़ोल्डर में सभी नियंत्रक हैं। अब मेरे पास कुछ कार्यक्षमता है जिसे मैं जोड़ना चाहता हूं लेकिन मैं इसे एक अलग दृश्य स्टूडियो प्रोजेक्ट पर रखना चाहता हूं जिसमें इसके स्वयं के नियंत्रक (और मॉडल और विचार) फ़ोल्डर होंगे। क्या यह संभव है ताकि मैं कुछ प्रकार का मॉड्यूल तैयार कर सकूं जो webapi2 द्वारा लोड किया जाएगा?2 परियोजनाओं पर वेबपी 2 नियंत्रक
उत्तर
वेब एपीआई एक अनुरोध, एक डिफ़ॉल्ट कार्यान्वयन जो हल करने के लिए IAssembliesResolver पर निर्भर करता है है जो की से निपटने के लिए एपीआई नियंत्रक को चुनने के लिए IHttpControllerSelector पर निर्भर करता है एपीआई नियंत्रकों की तलाश करने के लिए असेंबली।
कम से कम न्यूनतम परिवर्तन में, आप इस असेंबली रिज़ॉल्वर को एक कस्टम कार्यान्वयन के साथ प्रतिस्थापित कर सकते हैं जो आपके लिए अन्य पुस्तकालयों को लोड करेगा।
एक बहुत भोली उदाहरण ऐसा दिखाई दे सकता:
public class CustomAssemblyResolver : IAssembliesResolver
{
public List<string> PluginNames { get; set; }
public CustomAssemblyResolver()
{
PluginNames = new List<string>();
//Add the custom libraries here
PluginNames.Add("Your_Second_Library");
}
public ICollection<Assembly> GetAssemblies()
{
var asms = AppDomain.CurrentDomain.GetAssemblies().ToList();
foreach (var name in PluginNames)
{
var asmPath = System.IO.Path.Combine(HostingEnvironment.MapPath("~/"), name + ".dll");
try
{
var asm= System.Reflection.Assembly.LoadFrom(asmPath);
if(!asms.Contains(asm))
asms.Add(asm);
}
catch (Exception)
{
}
}
return asms;
}
}
फिर आप WebApiConfig
वर्ग के अपने Register
विधि के अंदर इस कोड
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());
के साथ डिफ़ॉल्ट समाधानकर्ता बदल सकते हैं।
फिर, अपने सभी अतिरिक्त पुस्तकालयों को नियंत्रक कक्षाओं के साथ बिन निर्देशिका में कॉपी करें और आप कर चुके हैं।
यदि आपको नियंत्रक चयन के लिए और भी अनुकूलन की आवश्यकता है, तो आप IHttpControllerSelector
के कस्टम कार्यान्वयन के लिए जा सकते हैं और मौजूदा कार्यान्वयन को इसी तरह से बदल सकते हैं।
आप लाइब्रेरी प्रोजेक्ट में कार्यक्षमता बना सकते हैं, और उसके बाद उस परियोजना को अपने वेबपीआई 2 और आपके अन्य दृश्य स्टूडियो प्रोजेक्ट में संदर्भित कर सकते हैं। असल में आपके पास तीन समाधान होंगे; दो वेबपी समाधान और एक पुस्तकालय समाधान। लाइब्रेरी समाधान में दो वेबपी समाधानों के लिए आवश्यक आवश्यक तर्क शामिल होगा।
आपको दो परियोजनाओं में नियंत्रकों की आवश्यकता नहीं होनी चाहिए।
यदि नियंत्रक पूरी तरह से अलग-अलग व्यवसाय डोमेन के लिए हैं, तो आईआईएस डब्ल्यू/दो समाधानों में दो एपीआई बनाएं।
यदि वे समान हैं, तो वेब प्रोजेक्ट में अपने सभी नियंत्रकों को बनाएं। फिर इन नियंत्रकों को अलग-अलग एप्लिकेशन सेवाओं के लिए कॉल करें।
public CustomerAccountsController : ApiController
{
private CustomerAccountService _customerAccountService; // lives in application layer project
public CustomerAccountsController()
{
// di stuff
}
public HttpResponseMessage PutCancelAccount(int accountId)
{
// exception handling + logging
_customerAccountService.CancelAccount(accountId);
// return status code if success, or if an exception
}
}
public OrderController : ApiController
{
private OrderService _orderService; // lives in application layer project
public OrderController()
{ //di stuff
}
public HttpResponseMessage PostCreateOrder(CreateOrderRequest createOrderRequest)
{
// exception handling + logging
_orderService.TakeOrder(createOrderRequest);
// return status code if success, or if an exception
}
}
तो, अपने तर्क के सबसे अनुप्रयोग परत सेवाओं के पीछे छिपाने चाहिए, और इन सेवाओं के तरीकों कि नक्शा 1-1 मामलों उपयोग करने के लिए होना चाहिए। यदि इन दो अनुप्रयोगों के लिए आपका व्यावसायिक डोमेन पूरी तरह से अलग है, तो बस दो अलग-अलग समाधान और दो अलग-अलग आईआईएस अनुप्रयोग/एपीआई
आप क्षेत्र पर भी विचार कर सकते हैं। वेब एपी भी है, है ना? –
नहीं, यह संभव नहीं है। अधिकतम आप कर सकते हैं क्लास लाइब्रेरी बनाते हैं जो एक डीएलएल के रूप में संकलित होगा, फिर संदर्भित करें कि आपके WebApi में DLL। अन्यथा, आप या तो एक ही एप्लिकेशन (WebApi) में सबकुछ डालने के लिए बाध्य होंगे या दो अलग-अलग वेबएपी अनुप्रयोग बनाएंगे।
...
मेरे सलाह, बस एक ही परियोजना पर 2 नियंत्रकों रख दिया और अपने अन्य परियोजना में एक सहायक/सेवा फ़ोल्डर/वर्ग बना सकते हैं और उन सेवाओं को जब भी आप की जरूरत है कहते हैं।
यह वास्तव में आपके प्रश्न का उत्तर नहीं है लेकिन मेरा मानना है कि इससे मदद मिलेगी। आम तौर पर हम एक समाधान इस फ़ोल्डर संरचना का उपयोग बनाने के लिए, मुझे आशा है कि इस मदद करता है:
MyTeamSolution
- MyTeam.Core = Class libraries
> Models
> Model1.cs
> Model2.cs
> Model3.cs
> Interface
> ISomeInterface.cs
> Helpers
> HelperClass.cs
- MyTeam.Api = webapi project
> Model1Controller.cs
> Model2Controller.cs
> Model3Controller.cs
- MyTeam.Web = mvc project
> Controllers
> Models
> Views
> etc.
- MyTeam.Sql = Class libraries
> MyTeamDbContext.cs
- 1. जेडएफ 2: नियंत्रक
- 2. एक सिम्फनी 2 नियंत्रक
- 3. वेब एपीआई 2 नियंत्रक
- 4. सिम्फनी 2 नियंत्रक
- 5. वेबपी
- 6. एएसपीनेट वेबपी
- 7. जेडएफ 2 नियंत्रक का उपयोग नियंत्रक
- 8. watchOS 2: प्रारंभिक इंटरफ़ेस नियंत्रक
- 9. वाईआई 1: नियंत्रक :: वाईआई 2
- 10. सिम्फनी 2 नियंत्रक में कन्स्ट्रक्टर
- 11. ज़ेंड फ्रेमवर्क 2: मैं नियंत्रक
- 12. वेबपी
- 13. ASP.NET MVC 2 पूर्वावलोकन 2: क्षेत्रों नकल नियंत्रक समस्या
- 14. वेबपी
- 15. आयोनिक 2 लोड हो रहा है नियंत्रक
- 16. ज़ेंड फ्रेमवर्क 2 नया नियंत्रक जोड़ें
- 17. एएसपीनेट एमवीसी 2 नियंत्रक कैसे तत्काल हैं?
- 18. नियंत्रक को 2 पैरामीटर कैसे रूट करें?
- 19. बेस नियंत्रक में संपत्ति इंजेक्शन Ninject 2
- 20. प्ले 2 रिवर्स मार्ग,, नियंत्रक विधि
- 21. ज़ेंड फ्रेमवर्क 2 में, आप नियंत्रक
- 22. वेबपी: JSON
- 23. वेबपी लाइब्रेरी?
- 24. वेबपी: http
- 25. स्ट्रूट 2
- 26. आयनिक 2 + कोणीय 2 -
- 27. मैं एकाधिक कोणीय 2 परियोजनाओं के बीच एक कोणीय 2 घटक कैसे साझा कर सकता हूं?
- 28. एकाधिक परियोजनाओं को विभाजित करना w/play! 2 (स्कैला)
- 29. एमवीसी 2 आरसी 2
- 30. कोणीय 2
1) वेब प्रोजेक्ट में सभी नियंत्रकों को रखें, और उन नियंत्रकों को अलग-अलग सेवाओं (जो किसी अन्य प्रोजेक्ट में रहते हैं) पर कॉल करें। थोड़ा, कोई तर्क नहीं (अपवाद हैंडलिंग/लॉगिंग के अलावा) आपके नियंत्रकों में होना चाहिए। उन्हें काम करने के लिए सिर्फ एक और कक्षा में फोन करना चाहिए। 2) आईआईएस के तहत दो अलग-अलग एप्लिकेशन बनाएं, और एक नया एपीआई बनाएं। –