2017-02-02 28 views
5

मेरे पास एक वेबपीआई 2 सी # परियोजनाएं हैं जिन पर मेरे पास नियंत्रक फ़ोल्डर में सभी नियंत्रक हैं। अब मेरे पास कुछ कार्यक्षमता है जिसे मैं जोड़ना चाहता हूं लेकिन मैं इसे एक अलग दृश्य स्टूडियो प्रोजेक्ट पर रखना चाहता हूं जिसमें इसके स्वयं के नियंत्रक (और मॉडल और विचार) फ़ोल्डर होंगे। क्या यह संभव है ताकि मैं कुछ प्रकार का मॉड्यूल तैयार कर सकूं जो webapi2 द्वारा लोड किया जाएगा?2 परियोजनाओं पर वेबपी 2 नियंत्रक

+1

1) वेब प्रोजेक्ट में सभी नियंत्रकों को रखें, और उन नियंत्रकों को अलग-अलग सेवाओं (जो किसी अन्य प्रोजेक्ट में रहते हैं) पर कॉल करें। थोड़ा, कोई तर्क नहीं (अपवाद हैंडलिंग/लॉगिंग के अलावा) आपके नियंत्रकों में होना चाहिए। उन्हें काम करने के लिए सिर्फ एक और कक्षा में फोन करना चाहिए। 2) आईआईएस के तहत दो अलग-अलग एप्लिकेशन बनाएं, और एक नया एपीआई बनाएं। –

उत्तर

0

वेब एपीआई एक अनुरोध, एक डिफ़ॉल्ट कार्यान्वयन जो हल करने के लिए 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 के कस्टम कार्यान्वयन के लिए जा सकते हैं और मौजूदा कार्यान्वयन को इसी तरह से बदल सकते हैं।

-1

आप लाइब्रेरी प्रोजेक्ट में कार्यक्षमता बना सकते हैं, और उसके बाद उस परियोजना को अपने वेबपीआई 2 और आपके अन्य दृश्य स्टूडियो प्रोजेक्ट में संदर्भित कर सकते हैं। असल में आपके पास तीन समाधान होंगे; दो वेबपी समाधान और एक पुस्तकालय समाधान। लाइब्रेरी समाधान में दो वेबपी समाधानों के लिए आवश्यक आवश्यक तर्क शामिल होगा।

-1

आपको दो परियोजनाओं में नियंत्रकों की आवश्यकता नहीं होनी चाहिए।

यदि नियंत्रक पूरी तरह से अलग-अलग व्यवसाय डोमेन के लिए हैं, तो आईआईएस डब्ल्यू/दो समाधानों में दो एपीआई बनाएं।

यदि वे समान हैं, तो वेब प्रोजेक्ट में अपने सभी नियंत्रकों को बनाएं। फिर इन नियंत्रकों को अलग-अलग एप्लिकेशन सेवाओं के लिए कॉल करें।

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 मामलों उपयोग करने के लिए होना चाहिए। यदि इन दो अनुप्रयोगों के लिए आपका व्यावसायिक डोमेन पूरी तरह से अलग है, तो बस दो अलग-अलग समाधान और दो अलग-अलग आईआईएस अनुप्रयोग/एपीआई

+0

आप क्षेत्र पर भी विचार कर सकते हैं। वेब एपी भी है, है ना? –

-1

नहीं, यह संभव नहीं है। अधिकतम आप कर सकते हैं क्लास लाइब्रेरी बनाते हैं जो एक डीएलएल के रूप में संकलित होगा, फिर संदर्भित करें कि आपके WebApi में DLL। अन्यथा, आप या तो एक ही एप्लिकेशन (WebApi) में सबकुछ डालने के लिए बाध्य होंगे या दो अलग-अलग वेबएपी अनुप्रयोग बनाएंगे।

-1
अपनी आवश्यकताओं पर निर्भर करता है

...

मेरे सलाह, बस एक ही परियोजना पर 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 
संबंधित मुद्दे