টেরি আমার বন্ধু, আপনি এবং আমার একটি পানীয় পান করা উচিত। আমাদের কিছু একই সমস্যা আছে।
১. প্রকল্পের কাঠামো: আমি এডুয়ার্ডোর সাথে একমত যে একটি এমভিসি অ্যাপ্লিকেশনটিতে ফোল্ডারটির কাঠামোটি পছন্দসই কিছু রেখে দেয়। আপনার কাছে আপনার স্ট্যান্ডার্ড কন্ট্রোলার, মডেল এবং দর্শন ফোল্ডার রয়েছে। কিন্তু তারপরে ভিউ ফোল্ডারটি প্রতিটি নিয়ামকের জন্য পৃথক ফোল্ডারে এবং একটি ভাগ করা ফোল্ডার হিসাবে বিভক্ত হয়ে যায়। এবং প্রতিটি ভিউ / কন্ট্রোলারনাম বা ভিউ / ভাগ করা ভাগ করে এডিটর টেম্প্লেটস এবং ডিসপ্লেটিম্পলেটগুলিতে বিভক্ত হতে পারে। তবে এটি আপনাকে কীভাবে আপনার মডেল ফোল্ডারটি সংগঠিত করবেন তা সিদ্ধান্ত নিতে দেয় (আপনি সাবফোল্ডার এবং অতিরিক্ত নেমস্পেসের ঘোষণার সাথে বা এটি ছাড়াও করতে পারেন)।
Forbশ্বর আপনি অঞ্চলগুলি ব্যবহার করছেন না, যা প্রতিটি অঞ্চলের জন্য কন্ট্রোলার, মডেল এবং দর্শন ফোল্ডার কাঠামোর নকল করে।
/Areas
/Area1Name
/Controllers
FirstController.cs
SecondController.cs
ThirdController.cs
/Models
(can organize all in here or in separate folders / namespaces)
/Views
/First
/DisplayTemplates
WidgetAbc.cshtml <-- to be used by views in Views/First
/EditorTemplates
WidgetAbc.cshtml <-- to be used by views in Views/First
PartialViewAbc.cshtml <-- to be used by FirstController
/Second
PartialViewDef.cshtml <-- to be used by SecondController
/Third
PartialViewMno.cshtml <-- to be used by ThirdController
/Shared
/DisplayTemplates
WidgetXyz.cshtml <-- to be used by any view in Area1
/EditorTemplates
WidgetXyz.cshtml <-- to be used by any view in Area1
PartialViewXyz.cshtml <-- to be used anywhere in Area1
_ViewStart.cshtml <-- area needs its own _ViewStart.cshtml
Web.config <-- put custom HTML Helper namespaces in here
Area1NameRegistration.cs <-- define routes for area1 here
/Area2Name
/Controllers
/Models
/Views
Area2NameRegistration.cs <-- define routes for area2 here
/Controllers
AccountController.cs
HomeController.cs
/Models
/Views
/Account
/DisplayTemplates
WidgetGhi.cshtml <-- to be used views in Views/Account
/EditorTemplates
WidgetGhi.cshtml <-- to be used views in Views/Account
PartialViewGhi.cshtml <-- to be used by AccountController
/Home
(same pattern as Account, views & templates are controller-specific)
/Shared
/DisplayTemplates
EmailAddress.cshtml <-- to be used by any view in any area
Time.cshtml <-- to be used by any view in any area
Url.cshtml <-- to be used by any view in any area
/EditorTemplates
EmailAddress.cshtml <-- to be used by any view in any area
Time.cshtml <-- to be used by any view in any area
Url.cshtml <-- to be used by any view in any area
_Layout.cshtml <-- master layout page with sections
Error.cshtml <-- custom page to show if unhandled exception occurs
_ViewStart.cshtml <-- won't be used automatically in an area
Web.config <-- put custom HTML Helper namespaces in here
এর অর্থ যদি আপনি উইজেটকন্ট্রোলারের মতো কিছু নিয়ে কাজ করে থাকেন তবে আপনাকে সংশ্লিষ্ট উইজেটভিউমোডেলস, উইজেটভিউস, উইজেটএডিটরটিম্পলেটস, উইজেটডিসপ্লিটপ্লেপলেটস ইত্যাদির সন্ধান করতে অন্য ফোল্ডারগুলিতে সন্ধান করতে হবে, যতই জটিল হতে পারে, আমি এটিকে আঁকড়ে ধরি এবং এ থেকে বিচ্যুত হই না এই এমভিসি সম্মেলন। একই ফোল্ডারে কোনও মডেল, নিয়ামক এবং দেখুন হিসাবে যতই না আলাদা আলাদা আলাদা আলাদা নাম রয়েছে তবে আমি এটি এড়িয়ে চলেছি কারণ আমি রিশার্পার ব্যবহার করি। এটি স্কুগলি এমন একটি নেমস্পেসকে আন্ডারলাইন করবে যা ক্লাসটি যেখানে অবস্থিত ফোল্ডারের সাথে মেলে না। আমি জানি আমি এই আর # বৈশিষ্ট্যটি বন্ধ করে দিতে পারি, তবে এটি প্রকল্পের অন্যান্য অংশগুলিতে সহায়তা করে।
শ্রেণিবদ্ধ ফাইলগুলির জন্য, এমভিসি আপনাকে বাক্সের বাইরে সামগ্রী এবং স্ক্রিপ্ট দেয়। আমরা আমাদের সমস্ত স্থিতিশীল / নন-সংকলিত ফাইলগুলিকে এই জায়গাগুলিতে আবার রাখার চেষ্টা করি, কনভেনশন অনুসরণ করতে। যে কোনও সময় আমরা কোনও জেএস লাইব্রেরি অন্তর্ভুক্ত করি যা থিমগুলি (চিত্র এবং বা সিএসএস) ব্যবহার করে, থিম ফাইলগুলি সমস্তই কোথাও / সামগ্রীর আওতায় চলে। স্ক্রিপ্টের জন্য, আমরা কেবল তাদের সরাসরি / স্ক্রিপ্টগুলিতে রেখেছি। মূলত এটি ছিল ভিএস এর কাছ থেকে জেএস ইন্টেলিসেন্স পাওয়া, তবে এখন আমরা / স্ক্রিপ্টগুলিতে স্থান নির্বিশেষে আর # থেকে জেএস ইনটেলিসেন্স পেয়েছি, আমি মনে করি আমরা এটি থেকে বিচ্যুত হতে পারি এবং আরও ভালভাবে সজ্জায় স্ক্রিপ্টগুলি ফোল্ডারে ভাগ করতে পারি। আপনি কি রিসার্পার ব্যবহার করছেন? এটি খাঁটি সোনার আইএমও।
স্বর্ণের আরেকটি ছোট টুকরা যা রিফ্যাক্টরিংয়ে অনেক সহায়তা করে তা হ'ল টি 4 এমভিসি। এটি ব্যবহার করে, ক্ষেত্রের নাম, নিয়ামকের নাম, ক্রিয়া নাম, এমনকি সামগ্রী এবং স্ক্রিপ্টগুলিতে ফাইলের জন্য আমাদের স্ট্রিং পাথ টাইপ করতে হবে না। T4MVC আপনার জন্য জাদুর সমস্ত স্ট্রিং জোরালোভাবে টাইপ করে। আপনি যদি T4MVC ব্যবহার করেন তবে কীভাবে আপনার প্রকল্পের কাঠামো তত গুরুত্বপূর্ণ নয় তার একটি ছোট্ট নমুনা এখানে:
// no more magic strings in route definitions
context.MapRoutes(null,
new[] { string.Empty, "features", "features/{version}" },
new
{
area = MVC.PreviewArea.Name,
controller = MVC.PreviewArea.Features.Name,
action = MVC.PreviewArea.Features.ActionNames.ForPreview,
version = "december-2011-preview-1",
},
new { httpMethod = new HttpMethodConstraint("GET") }
);
@* T4MVC renders .min.js script versions when project is targeted for release *@
<link href="@Url.Content(Links.content.Site_css)?r=201112B" rel="stylesheet" />
<script src="@Url.Content(Links.scripts.jquery_1_7_1_js)" type="text/javascript">
</script>
@* render a route URL as if you were calling an action method directly *@
<a href="@Url.Action(MVC.MyAreaName.MyControllerName.MyActionName
(Model.SomeId))">@Html.DisplayFor(m => m.SomeText)</a>
// call action redirects as if you were executing an action method
return RedirectToAction(MVC.Area.MyController.DoSomething(obj1.Prop, null));
২. ডেটা অ্যাক্সেস: পেটাপোকোর সাথে আমার কোনও অভিজ্ঞতা নেই তবে আমি নিশ্চিত যে এটি পরীক্ষা করে দেখার মতো। আপনার জটিল প্রতিবেদনের জন্য, আপনি কি এসকিউএল সার্ভার রিপোর্টিং পরিষেবাদি বিবেচনা করেছেন? অথবা, আপনি কি অন্য কোনও ডিবিতে চালাচ্ছেন? দুঃখিত আপনি ঠিক কী চাইছেন তা সম্পর্কে আমি পরিষ্কার নই। আমরা ইএফ + লিনকিউ ব্যবহার করি তবে ডোমেন ক্লাসে কীভাবে প্রতিবেদন তৈরি করা যায় সে সম্পর্কে আমরা নির্দিষ্ট জ্ঞানও রেখেছি। সুতরাং, সরাসরি কন্ট্রোলার কল সংগ্রহস্থলের পরিবর্তে আমাদের কাছে কন্ট্রোলার কল ডোমেন পরিষেবা কল রিপোজিটরি রয়েছে। অ্যাড-হক রিপোর্টগুলির জন্য আমরা এসকিউএল রিপোর্টিং পরিষেবাগুলি ব্যবহার করি, যা আবার নিখুঁত নয় তবে আমাদের ব্যবহারকারীরা সহজেই এক্সেলের মধ্যে ডেটা আনতে সক্ষম হতে চান এবং এসএসআরএস আমাদের পক্ষে এটি সহজ করে তোলে।
৩. ক্লায়েন্ট-সাইড কোড অর্গানাইজেশন এবং ইউআই রেন্ডারিং: আমি মনে করি যে আমি এখানে কিছু সহায়তা দিতে সক্ষম হতে পারি। এমভিসি অবিচ্ছিন্ন বৈধতা এবং স্ববিরোধী এজেএক্সের বই থেকে একটি পৃষ্ঠা নিন। এই বিবেচনা:
<img id="loading_spinner" src="/path/to/img" style="display:none;" />
<h2 id="loading_results" style="display:none;">
Please wait, this may take a while...
</h2>
<div id="results">
</div>
<input id="doSomethingDangerous" class="u-std-ajax"
type="button" value="I'm feeling lucky"
data-myapp-confirm="Are you sure you want to do this?"
data-myapp-show="loading_spinner,loading_results"
data-myapp-href="blah/DoDangerousThing" />
আপাতত এজাক্স সাফল্য ফাংশন উপেক্ষা করুন (আরও পরে এটি)। আপনার কিছু ক্রিয়াকলাপের জন্য আপনি একটি একক স্ক্রিপ্ট নিয়ে পালাতে পারেন:
$('.u-std-ajax').click(function () {
// maybe confirm something first
var clicked = this;
var confirmMessage = $(clicked).data('myapp-confirm');
if (confirmMessage && !confirm(confirmMessage )) { return; }
// show a spinner? something global would be preferred so
// I dont have to repeat this on every page
// maybe the page should notify the user of what's going on
// in addition to the dialog?
var show = $(clicked).data('myapp-show');
if (show) {
var i, showIds = show.split(',');
for (i = 0; i < showIds.length; i++) {
$('#' + showIds[i]).show();
}
}
var url = $(clicked).data('myapp-href');
if (url) {
$.ajax({
url: url,
complete: function () {
// Need to hide the spinner, again would prefer to
// have this done elsewhere
if (show) {
for (i = 0; i < showIds.length; i++) {
$('#' + showIds[i]).hide();
}
}
}
});
}
});
উপরের কোডটি নিশ্চিতকরণের যত্ন নেবে, স্পিনার দেখানো, অপেক্ষার বার্তা প্রদর্শন করা এবং এজেনার কলটি শেষ হওয়ার পরে স্পিনার / অপেক্ষার বার্তাটি লুকিয়ে রাখা। আপনি ব্যবহারহীন গ্রন্থাগারগুলির মতো ডেটা * বৈশিষ্ট্যগুলি ব্যবহার করে আচরণগুলি কনফিগার করেন।
সাধারণ প্রশ্ন
- ক্লায়েন্ট এমভিসি বনাম সার্ভার এমভিসি? সাফল্য ফাংশনে আপনি যে পদক্ষেপ নিয়েছিলেন তা আমি গ্রন্থাগারিত করার চেষ্টা করিনি কারণ দেখে মনে হচ্ছে আপনার নিয়ামকটি JSON ফিরিয়ে দিচ্ছে। যদি আপনার কন্ট্রোলাররা JSON ফিরিয়ে দেয় তবে আপনি নকআউটজেএস-তে নজর রাখতে পারেন। নকআউট জেএস সংস্করণ ২.০ প্রকাশিত হয়েছে আজ । এটি সরাসরি আপনার JSON এ প্লাগ করতে পারে, যাতে পর্যবেক্ষণযোগ্য ক্লিকটি স্বয়ংক্রিয়ভাবে আপনার জাভাস্ক্রিপ্ট টেম্পলেটগুলিতে ডেটা বাঁধতে পারে। অন্যদিকে, আপনি যদি আপনার এজাক্স অ্যাকশন পদ্ধতিগুলি JSON এর পরিবর্তে এইচটিএমএল ফেরত নিতে আপত্তি করেন না, তবে তারা এলআই বাচ্চাদের সাথে ইতিমধ্যে নির্মিত ইউএল ফিরিয়ে দিতে পারে এবং আপনি ডেটা-ম্যাপ অ্যাপ্লিকেশন = ব্যবহার করে কোনও উপাদানটিতে এটি যুক্ত করতে পারেন = "ফলাফল"। আপনার সাফল্যের ক্রিয়াকলাপটি কেবল তখন এর মতো দেখাবে:
success: function(html) {
var responseId = $(clicked).data('myapp-response');
if (responseId) {
$('#' + responseId).empty().html(html);
}
}
এর জন্য আমার সেরা উত্তরের সংক্ষিপ্তসার হিসাবে, যদি আপনাকে অবশ্যই আপনার ক্রিয়া পদ্ধতিগুলি থেকে JSON ফিরিয়ে দিতে হয় তবে আপনি সার্ভার-সাইড ভিউ এড়িয়ে যাচ্ছেন, সুতরাং এটি সত্যই সার্ভার এমভিসি নয় - এটি কেবল এমসি। আপনি যদি এইজএক্স কলগুলিতে এইচটিএমএল সহ আংশিকভিউ ফলাফলটি ফেরত দেন তবে এটি সার্ভার এমভিসি। সুতরাং যদি আপনার অ্যাপ্লিকেশনটিকে অবশ্যই অজ্যাক্স কলগুলির জন্য জেএসওএন ডেটা ফেরত দিতে পারে তবে নোকআউটজেএসের মতো ক্লায়েন্ট এমভিভিএম ব্যবহার করুন।
যে কোনও উপায়ে, আপনার পোস্ট করা জেএসটি আমি পছন্দ করি না কারণ এটি আপনার লেআউটকে (এইচটিএমএল ট্যাগগুলি) আচরণের সাথে মিশ্রিত করে (অ্যাসিঙ্ক্রোনাস ডেটা লোড)। খাঁটি জেএসএন ভিউ মডেল ডেটা সহ আংশিক এইচটিএমএল ভিউ বা ক্লায়েন্ট এমভিভিএম সহ সার্ভার এমভিসি নির্বাচন করা আপনার পক্ষে এই সমস্যার সমাধান করবে, তবে জাভাস্ক্রিপ্টে ম্যানুয়ালি ডিওএম / এইচটিএমএল তৈরি করা উদ্বেগের বিচ্ছেদ লঙ্ঘন করে।
- জাভাস্ক্রিপ্ট ফাইল তৈরি স্পষ্টতই সংশোধন বৈশিষ্ট্যগুলি .NET 4.5 এ আসছে । আপনি যদি আপত্তিহীন রুটে যান তবে 1 টি স্ক্রিপ্ট ফাইলে আপনার সমস্ত জেএস লোড করা থেকে বিরত থাকার কিছু নেই। আমি প্রতিটি সত্তার ধরণের জন্য বিভিন্ন জেএস ফাইল তৈরি সম্পর্কে সতর্কতা অবলম্বন করব, আপনি জেএস ফাইল বিস্ফোরণে শেষ হবেন। মনে রাখবেন, একবার আপনার স্ক্রিপ্ট ফাইলটি লোড হয়ে গেলে, ব্রাউজারটিকে ভবিষ্যতের অনুরোধগুলির জন্য এটি ক্যাশে করা উচিত।
- জটিল জিজ্ঞাসাগুলি আমি পৃষ্ঠাবদ্ধকরণ, বাছাই ইত্যাদির মতো বৈশিষ্ট্যটিকে জটিল বলে বিবেচনা করি না। আমার পছন্দটি হ'ল ইউআরএল এবং সার্ভার-সাইড যুক্তি দিয়ে এটি হ্যান্ডেল করা, ডিবি কোয়েরিগুলিকে প্রয়োজনীয় হিসাবে সীমাবদ্ধ করা। তবে আমরা আজুরেতে মোতায়েন, সুতরাং ক্যোয়ারী অপ্টিমাইজেশন আমাদের কাছে গুরুত্বপূর্ণ। উদাহরণস্বরূপ: /widgets/show-{pageSize}-per-page/page-{pageNumber}/sort-by-{sortColumn}-{sortDirection}/{keyword}
। ইএফ এবং লিনকিউ থেকে সত্তা। আমি এখনও ক্লায়েন্টলিবের প্রয়োজনীয়তা খুঁজে পাইনি, তাই আমি সত্যই তাদের সম্পর্কে বেশি কিছু জানি না। এ সম্পর্কে আরও পরামর্শের জন্য অন্যান্য উত্তরের দিকে নজর দিন।
- প্রকল্পের রেশম এটি সম্পর্কে কখনও শুনেনি, এটি পরীক্ষা করে দেখতে হবে। আমি স্টিভ স্যান্ডারসন, তার বই, তার বিগন কালেকশন আইটেম এইচটিএমএল হেল্পার এবং তার ব্লগের একটি বড় অনুরাগী। তাই বলা হয়, আমি KnockoutJS সঙ্গে কোনো অভিজ্ঞতা নেই উৎপাদনে । আমি এর টিউটোরিয়ালগুলি পরীক্ষা করে দেখেছি, তবে এটির কমপক্ষে 2.0 সংস্করণ না হওয়া পর্যন্ত আমি কিছু করার প্রতিশ্রুতি না দেওয়ার চেষ্টা করছি। আমি যেমন উল্লেখ করেছি, নকআউটজেএস ২.০ সবেমাত্র প্রকাশিত হয়েছিল।
- এন-স্তর যদি স্তর দ্বারা আপনি বিভিন্ন শারীরিক মেশিনটি বোঝাতে চান, তবে না, আমি মনে করি না যে কোনও উইন্ডো বেরিয়েছে। সাধারণত 3-স্তরের অর্থ আপনার কাছে 3 টি মেশিন রয়েছে। সুতরাং আপনার উপস্থাপনা স্তর হিসাবে আপনার কাছে চর্বিযুক্ত ক্লায়েন্ট থাকতে পারে, যা ব্যবহারকারীর মেশিনে চলে। ফ্যাট ক্লায়েন্ট কোনও পরিষেবা স্তরে অ্যাক্সেস করতে পারে যা কোনও অ্যাপ্লিকেশন সার্ভারে চলে এবং এক্সএমএল বা ফ্যাট ক্লায়েন্টকে যা কিছু দেয় তা প্রদান করে। এবং পরিষেবা স্তরটি কোনও তৃতীয় মেশিনে একটি এসকিউএল সার্ভার থেকে এর ডেটা পেতে পারে।
এমভিসি হ'ল এক স্তর, 1 স্তরের। আপনার নিয়ামক, মডেল এবং দর্শনগুলি আপনার উপস্থাপনা স্তরটির সমস্ত অংশ যা দৈহিক আর্কিটেকচারের 1 স্তরের। এমভিসি মডেল-ভিউ-কন্ট্রোলার প্যাটার্ন প্রয়োগ করে, যেখানে আপনি অতিরিক্ত স্তর দেখতে পাচ্ছেন। তবে এই 3 টি দিককে স্তর বা স্তর হিসাবে না ভাবার চেষ্টা করুন। তাদের তিনটিকে উপস্থাপনা স্তর কনসার্নস হিসাবে ভাবার চেষ্টা করুন।
প্রেস / বাস / ডেটা মন্তব্যের পরে আপডেট করুন
ঠিক আছে, সুতরাং আপনি স্তর এবং স্তর আন্তঃব্যবহারযোগ্যভাবে ব্যবহার করছেন। আমি সাধারণত যৌক্তিক / প্রকল্প / সমাবেশ বিভাগগুলির জন্য "স্তর" শব্দটি এবং শারীরিক নেটওয়ার্ক পৃথককরণের জন্য স্তর ব্যবহার করি। বিভ্রান্তির জন্য দুঃখিত.
এমভিসি ক্যাম্পে আপনি বেশ কয়েক জনকে দেখতে পাবেন যারা বলে যে আপনার সত্তার ডেটা মডেলের জন্য এমভিসিতে "মডেলগুলি" ব্যবহার করা উচিত নয়, বা ব্যবসার যুক্তির জন্য আপনার কন্ট্রোলার ব্যবহার করা উচিত নয়। আদর্শভাবে আপনার মডেলগুলি ভিউ-নির্দিষ্ট ভিউমোডেলগুলি হওয়া উচিত। অটোম্যাপারের মতো কিছু ব্যবহার করে, আপনি নিজের ডোমেন মডেল থেকে আপনার সত্তাগুলি নিয়ে যান এবং সেগুলি ডিভিওতে ভিউমোডেলগুলিতে নিয়ে যান, বিশেষত দর্শন দ্বারা ব্যবহারের জন্য ভাস্কর্যযুক্ত।
যে কোনও ব্যবসায়ের নিয়মগুলিও আপনার ডোমেনের অংশ হওয়া উচিত এবং আপনি এমভিসি উপস্থাপনা স্তরে নয়, ডোমেন পরিষেবা / কারখানার প্যাটার্ন / আপনার ডোমেন স্তরটিতে যা উপযুক্ত তা ব্যবহার করে এগুলি প্রয়োগ করতে পারেন। মডেলগুলির মতো বোবা না হলেও কন্ট্রোলারদের বোবা হওয়া উচিত এবং ব্যবসায়ের জ্ঞানের প্রয়োজন এমন কোনও কিছুর জন্য ডোমেনকে দায়িত্ব দেওয়া উচিত। কন্ট্রোলাররা এইচটিটিপি অনুরোধ এবং প্রতিক্রিয়াগুলির প্রবাহ পরিচালনা করে তবে প্রকৃত ব্যবসায়ের মান সহ যে কোনও কিছুই নিয়ামকের বেতন গ্রেডের উপরে হওয়া উচিত।
সুতরাং, উপস্থাপনা স্তর হিসাবে এমভিসি সহ আপনার এখনও একটি স্তরযুক্ত আর্কিটেকচার থাকতে পারে। আপনি কীভাবে এটি আর্কিটেক্ট করেন তার উপর নির্ভর করে এটি আপনার অ্যাপ্লিকেশন স্তর, পরিষেবা স্তর বা ডোমেন স্তরের ক্লায়েন্ট। তবে শেষ পর্যন্ত আপনার সত্তা মডেলটি এমভিসির মডেল নয়, ডোমেনের অংশ হওয়া উচিত।