WCF RIA सेवाएँ। प्रारंभ। भाग 1

WCF RIA सेवाएँ। प्रारंभ। भाग 1
WCF RIA सेवाएँ। डेटा प्राप्त करें। भाग २
WCF RIA सेवाएँ। डेटा अपडेट। भाग ३
WCF RIA सेवाएँ। पेश है मॉडल-व्यू-व्यूमॉडल (एमवीवीएम) पैटर्न। भाग ४

अनुवादक से


अनुवाद की इस श्रृंखला में, मेरे द्वारा व्यक्तिगत रूप से एक अच्छा हिस्सा जोड़ा गया है, क्योंकि मूल एक पुराने वीएस का उपयोग करता है, साथ ही साथ कुछ, मेरी राय में, महत्वपूर्ण बिंदु जो गायब थे जिनके बिना सामग्री की आत्मसात बहुत जटिल है। चलो चलते हैं।

ध्यान से। बहुत सारी तस्वीरें!

प्रविष्टि


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

डब्ल्यूसीएफ आरआईए सेवा डेटा ट्रांसफर के स्वचालन और सिल्वरलाइट पर आधारित बहुस्तरीय अनुप्रयोगों के निर्माण की पेशकश करती है, जो काम के तर्क पर डेवलपर का ध्यान केंद्रित करती है। आप केवल एक बार सर्वर कोड की एक प्रति लिखते हैं, और यह डेवलपर की ओर से मैन्युअल ट्रिक या अन्य चाल के आवेदन की आवश्यकता के बिना, ग्राहक की ओर से स्वचालित रूप से पोर्ट की जाती है और उपलब्ध हो जाती है। क्लाइंट पर भी सभी सर्वर सुविधाएँ उपलब्ध रहती हैं, जैसे सत्यापन, एक्सेस अधिकार और कई अन्य।

लेखों की इस श्रृंखला में, आप WCF RIA सेवा की मुख्य विशेषताओं से परिचित हो जाएंगे, व्यवहार में देखें कि यह दृष्टिकोण क्या लाभ प्रदान करता है। नीचे दिए गए आरेख से पता चलता है कि WCF RIA सेवाएँ किसके लिए जिम्मेदार हैं:
छवि

आज हम मानक, सरलतम सिल्वरलाइट टेम्पलेट का उपयोग करेंगे। बाद के हिस्सों में, हम एप्लिकेशन को अंतिम रूप देकर और नई तकनीकों, टैक्टिक्स और तकनीकों का उपयोग करके अपने ज्ञान में वृद्धि करेंगे, जिनमें से एक मॉडल-व्यू-व्यू -मॉडल (एमवीवीएम) पैटर्न और यूनिट परीक्षण होगा।

बनाए जा रहे एप्लिकेशन द्वारा हल किए गए कार्य


बस एक इलेक्ट्रॉनिक नोटबुक जिसमें आप किसी घटना को दर्ज कर सकते हैं, उसे एक नाम, कलाकार, परियोजना, शुरुआत और समाप्ति तिथि दे सकते हैं। सामान्य तौर पर, कुछ भी जटिल या असामान्य नहीं है, लेकिन क्या किया जाना चाहिए इसकी एक अच्छी समझ केवल अध्ययन की तकनीक के ढांचे के भीतर यह करने की समझ की सुविधा प्रदान करेगी।

डब्ल्यूसीएफ आरआईए सेवाओं के पहलुओं को जानें:



चरण 1: एक सिल्वरलाइट एप्लिकेशन और सर्वर साइड का लिंक बनाएं।


हम एक साधारण डेटाबेस का उपयोग करेंगे जो कार्यों को बचाएगा, साथ ही साथ सभी संबंधित जानकारी भी। ऐसा करने के लिए, आपको प्रोजेक्ट के घोड़े में स्थित TaskManager.sql स्क्रिप्ट को चलाना होगा, एक डेटाबेस और स्कीमा बनाना होगा, डेटाबेस को प्रारंभिक मानों से भरना होगा।

एक नया प्रोजेक्ट बनाएं जिसका नाम है "टास्कमैनगर" । WCF RIA सेवा का उपयोग करने की क्षमता किसी भी प्रकार के सिल्वरलाइट एप्लिकेशन में निहित है। हालाँकि, चलो सरलतम से शुरू करते हैं और “सिल्वरलाइट एप्लिकेशन” टेम्पलेट चुनें।


ओके बटन पर क्लिक करने के बाद, निम्नलिखित डायलॉग बॉक्स खुलता है, जिसमें आपको "WCF RIA Services सक्षम करें" में एक बर्डी जोड़ने की आवश्यकता है।


इसके लिए धन्यवाद, सर्वर परियोजना के लिए आवश्यक लिंक बनाए जाएंगे, कोड पीढ़ी और पहले वर्णित अन्य फ़ंक्शन दिखाई देंगे।
ठीक पर क्लिक करें और परियोजना के निर्माण की प्रतीक्षा करें।

चरण 2: डोमेन मॉडल इकाई बनाएँ


चूंकि WCF RIA सेवाएँ मुख्य रूप से क्लाइंट से सर्वर और बैक पर डेटा को आगे और पीछे स्थानांतरित करने के लिए डिज़ाइन की गई हैं, इसलिए आपको कुछ डेटा मॉडल डेटा की आवश्यकता होगी। आउट ऑफ द बॉक्स एंटिटी फ्रेमवर्क समर्थित है। हालाँकि, WCF RIA Services Toolkit में LINQ to SQL का उपयोग करना संभव है। यदि आप अपनी स्वयं की डोमेन सेवा बनाते हैं, तो आप POCO के साथ काम कर सकते हैं। अब हम मानक इकाई फ्रेमवर्क का उपयोग करेंगे।

मूल टास्कमैनगर। एससीएल
USE [master] GO /****** Object: Database [TaskManager] Script Date: 06/06/2010 18:01:49 ******/ IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TaskManager.mdf') DROP DATABASE [TaskManager.mdf] GO CREATE DATABASE [TaskManager.mdf] GO USE [TaskManager.mdf] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[User]( [UserId] [int] IDENTITY(1,1) NOT NULL, [Username] [nvarchar](250) NOT NULL, [Password] [nvarchar](250) NOT NULL, CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ( [UserId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Customer]( [CustomerId] [int] IDENTITY(1,1) NOT NULL, [CustomerName] [nvarchar](250) NOT NULL, CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ( [CustomerId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Project]( [ProjectId] [int] IDENTITY(1,1) NOT NULL, [ProjectName] [nvarchar](250) NOT NULL, [Description] [nvarchar](max) NULL, [CustomerId] [int] NULL, CONSTRAINT [PK_Project] PRIMARY KEY CLUSTERED ( [ProjectId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Task]( [TaskId] [int] IDENTITY(1,1) NOT NULL, [TaskName] [nvarchar](250) NOT NULL, [Description] [nvarchar](max) NULL, [StartDate] [datetime] NULL, [EndDate] [datetime] NULL, [CustomerId] [int] NULL, [ProjectId] [int] NULL, [UserId] [int] NULL, CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED ( [TaskId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UsersTasks]( [TaskId] [int] NOT NULL, [UserId] [int] NOT NULL, CONSTRAINT [PK_UsersTasks] PRIMARY KEY CLUSTERED ( [TaskId] ASC, [UserId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TimeEntry]( [TimeEntryId] [int] IDENTITY(1,1) NOT NULL, [StartTime] [datetime] NOT NULL, [EndTime] [datetime] NOT NULL, [TaskId] [int] NOT NULL, [Description] [nvarchar](max) NOT NULL, CONSTRAINT [PK_TimeEntry] PRIMARY KEY CLUSTERED ( [TimeEntryId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Project] WITH CHECK ADD CONSTRAINT [FK_Project_Customer] FOREIGN KEY([CustomerId]) REFERENCES [dbo].[Customer] ([CustomerId]) GO ALTER TABLE [dbo].[Project] CHECK CONSTRAINT [FK_Project_Customer] GO ALTER TABLE [dbo].[Task] WITH CHECK ADD CONSTRAINT [FK_Task_Customer] FOREIGN KEY([CustomerId]) REFERENCES [dbo].[Customer] ([CustomerId]) GO ALTER TABLE [dbo].[Task] CHECK CONSTRAINT [FK_Task_Customer] GO ALTER TABLE [dbo].[Task] WITH CHECK ADD CONSTRAINT [FK_Task_Project] FOREIGN KEY([ProjectId]) REFERENCES [dbo].[Project] ([ProjectId]) GO ALTER TABLE [dbo].[Task] CHECK CONSTRAINT [FK_Task_Project] GO ALTER TABLE [dbo].[UsersTasks] WITH CHECK ADD CONSTRAINT [FK_UsersTasks_Task] FOREIGN KEY([TaskId]) REFERENCES [dbo].[Task] ([TaskId]) GO ALTER TABLE [dbo].[UsersTasks] CHECK CONSTRAINT [FK_UsersTasks_Task] GO ALTER TABLE [dbo].[UsersTasks] WITH CHECK ADD CONSTRAINT [FK_UsersTasks_User] FOREIGN KEY([UserId]) REFERENCES [dbo].[User] ([UserId]) GO ALTER TABLE [dbo].[UsersTasks] CHECK CONSTRAINT [FK_UsersTasks_User] GO ALTER TABLE [dbo].[TimeEntry] WITH CHECK ADD CONSTRAINT [FK_TimeEntry_Task] FOREIGN KEY([TaskId]) REFERENCES [dbo].[Task] ([TaskId]) GO ALTER TABLE [dbo].[TimeEntry] CHECK CONSTRAINT [FK_TimeEntry_Task] GO SET NUMERIC_ROUNDABORT OFF GO SET XACT_ABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON GO /*Pointer used for text / image updates. This might not be needed, but is declared here just in case*/ DECLARE @pv binary(16) BEGIN TRANSACTION SET IDENTITY_INSERT [dbo].[Task] OFF SET IDENTITY_INSERT [dbo].[Task] ON INSERT INTO [dbo].[Task] ([TaskId], [TaskName], [Description], [StartDate], [EndDate], [CustomerId], [ProjectId]) VALUES (1, N'Create Project', N'Create a Silverlight Application project with a RIA Services link', '20100601 00:00:00.000', '20100602 00:00:00.000', NULL, NULL) INSERT INTO [dbo].[Task] ([TaskId], [TaskName], [Description], [StartDate], [EndDate], [CustomerId], [ProjectId]) VALUES (2, N'Define Data Model', N'Create an Entity Framework model for the application data', '20100602 00:00:00.000', '20100603 00:00:00.000', NULL, NULL) INSERT INTO [dbo].[Task] ([TaskId], [TaskName], [Description], [StartDate], [EndDate], [CustomerId], [ProjectId]) VALUES (3, N'Define domain service', N'Create a domain service to expose task data to the client', '20100603 00:00:00.000', '20100604 00:00:00.000', NULL, NULL) INSERT INTO [dbo].[Task] ([TaskId], [TaskName], [Description], [StartDate], [EndDate], [CustomerId], [ProjectId]) VALUES (4, N'Use data in the Silverlight client', N'Use the DomainContext and DomainDataSource to access and manipulate the data in the client', '20100604 00:00:00.000', '20100605 00:00:00.000', NULL, NULL) SET IDENTITY_INSERT [dbo].[Task] OFF COMMIT TRANSACTION 


लेकिन Domain Model Entities बनाने से पहले, आपको एक डेटाबेस बनाना होगा और उसे पॉप्युलेट करना होगा।
ऐसा करने के लिए, सर्वर साइड (उपसर्ग के साथ। App) में "App_Data" फ़ोल्डर जोड़ें।






बनाए गए डेटाबेस "डेटाबेस * .mdf" पर डबल क्लिक करें। एक विंडो खुल जाएगी। हम फिर से इसमें "डेटाबेस * .mdf" का चयन करते हैं, दाहिने बटन के साथ - "नया अनुरोध"। क्वेरी संपादक खुल जाता है। ओपन टास्कमॉडल। एसक्यूएल, जिसके बारे में यह पहले ही उल्लेख किया गया है, और वहां से सब कुछ की प्रतिलिपि, पहली ऐसी लाइनों को छोड़कर:
 USE [master] GO /****** Object: Database [TaskManager] Script Date: 06/06/2010 18:01:49 ******/ IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TaskManager.mdf') DROP DATABASE [TaskManager.mdf] GO CREATE DATABASE [TaskManager.mdf] GO USE [TaskManager.mdf] GO 

"रन" बटन पर क्लिक करें। वह सब है। डेटाबेस तालिकाओं से भर जाता है, और कार्य तालिका डेटा से भर जाती है।

TaskManager.Web पर राइट-क्लिक करें और "Add" - "Create Element" चुनें। बाईं विंडो में "डेटा" टैब चुनें, और दाईं ओर "ADO.NET EDM मॉडल" चुनें। " TasksModel.edmx " नाम दें।


जोड़ें। EDM मॉडल विज़ार्ड संवाद बॉक्स खुलता है। वांछित डेटाबेस का चयन करें, इकाई का नाम " TaskManagerEntities " दें और अगला क्लिक करें।


अगले चरण में, टिक के साथ तालिका का चयन करें। हम मॉडल का नाम " TaskManagerMode l" देते हैं, और "बहुवचन या एकवचन में ऑब्जेक्ट नाम उत्पन्न करें " पर एक चेक मार्क भी लगाते हैं


देखा। अब आपके पास डेटाबेस में सभी टेबलों के लिए एंटिटी फ्रेमवर्क डेटा मॉडल है। हालाँकि, इस पाठ में आप केवल "कार्य" तालिका के साथ काम करेंगे; हालाँकि, आगे की तालिकाएँ जोड़ी जाएंगी।

यह सुनिश्चित करने के लिए एक समाधान बनाएं कि सब कुछ सही ढंग से किया गया है।

ईडीएम बनाने के बाद, डिजाइनर विंडो आपके लिए खुलनी चाहिए। यदि यह स्वचालित रूप से नहीं खुलती है, तो कार्य मुखपत्र के लिए समाधान एक्सप्लोरर में डबल-क्लिक करें। अगला, खाली क्षेत्र पर क्लिक करें। और गुण विंडो पर जाएं। "कोड पीढ़ी की रणनीति" पैरामीटर को "नहीं" से "डिफ़ॉल्ट" में बदलें। फिर कंपाइल।


अब डोमेन सेवा बनाने का समय आ गया है।

चरण 3: एक डोमेन सेवा बनाएँ


अब आरआईए सर्विसेज को कर्नेल बनाते हैं - एक डोमेन सेवा। सर्वर की ओर राइट-क्लिक करें: TaskManager.Web - "जोड़ें" - "तत्व बनाएं"। बाईं विंडो में, "वेब" श्रेणी का चयन करें, और दाईं ओर "डोमेन सेवा वर्ग"। " टास्कडोमेनसेवा " नाम दें।


ऐड बटन पर क्लिक करने के बाद, सर्विस सेटिंग्स विंडो पर जाएं। चूंकि अब हम केवल कार्य तालिका के साथ काम करेंगे, हम इसे चुनते हैं। "संपादन सक्षम करें" कॉलम में, चेक मार्क की जरूरत नहीं है। अलविदा। यदि आप इसे लगाते हैं, तो सीआरयूडी का एक सेट प्राप्त करें। यदि नहीं, तो केवल प्राप्त करें (पढ़ें)। ओके पर क्लिक करें।

टिप्पणियों के बिना उत्पन्न कोड इस तरह दिखेगा:
  [EnableClientAccess()] public class TasksDomainService : LinqToEntitiesDomainService<TasksModelEntities> { public IQueryable<Task> GetTasks() { return this.ObjectContext.Tasks; } } 


LinqToEntitiesDomainService वर्ग EDM मॉडल और RIA WCF सेवाओं के बीच एक लिंक प्रदान करता है। विशेषता "EnableClientAccess" इंगित करता है कि यह विधि स्वचालित कोड पीढ़ी के दौरान क्लाइंट भाग में जोड़ा जाना चाहिए। इस मामले में, हमें तालिका से केवल डेटा पढ़ने का एक तरीका मिला है, हालांकि, आप उस डेटा पर एक पूर्ण CRUD या किसी अन्य क्रिया को लागू कर सकते हैं, जिसकी आपको आवश्यकता होगी, और जो अंत में क्लाइंट प्रोजेक्ट में भी उपलब्ध होगी। हम इस पर विचार करेंगे कि निम्नलिखित लेखों में इसे और अधिक विस्तार से कैसे किया जाए।

यह भी याद रखें कि सम्मेलनों का उपयोग किया जाता है जो रिटर्न मान (क्वेरी करने योग्य) और नामकरण नियमों (गेटनेम) के प्रकार से संबंधित हैं। इस मामले में, हमारे पास ObjectContext डेटा मॉडल की एक प्रत्यायोजित इकाई है, जिसे बेस क्लास के हिस्से के रूप में बनाया गया है और पूरे टास्क टेबल को पुनः प्राप्त करने के लिए उपयोग किया जाता है। आप इस क्वेरी को सॉर्टिंग, फ़िल्टर इत्यादि जोड़कर भी सुधार सकते हैं, हालांकि, रिटर्न वैल्यू IQueryable प्रकार की है, WCF RIA सेवाएँ इसे समझती हैं और उपयुक्त तरीके बनाती हैं जो क्लाइंट की तरफ इस कार्यक्षमता का उपयोग करने की अनुमति देगा।

हम यह सुनिश्चित करने के लिए परियोजना का पुनर्निर्माण करेंगे कि सब कुछ सही ढंग से किया गया है। क्लाइंट प्रोजेक्ट में, जब आप दो शीट "सभी फाइलें दिखाएं" के आइकन पर क्लिक करते हैं, तो TaskManager.Web.g.cs नाम की एक फ़ाइल दिखाई देनी चाहिए, जिसमें क्लाइंट के लिए जनरेट किया गया कोड होता है।

चरण 4: DomainDataSource का उपयोग करके UI में डेटा पुनर्प्राप्त करना


आज हम WCF RIA सेवाओं के ऐसे फीचर का लाभ खींचें और छोड़ेंगे, जो कि सीधे UI में DomainDataSource का उपयोग करते हैं। निम्नलिखित भागों में, हम MVVM पैटर्न को भी देखेंगे, WCF RIA में इसका उपयोग कैसे करें, और इस दृष्टिकोण के साथ DomainDataSource का उपयोग कैसे करें।

इसलिए MainPage.xaml खोलें। इसके बाद, डेटा स्रोत विंडो खोलें। अब एक सफेद बॉक्स पर आलेखीय पृष्ठ संपादक में कार्य को खींचें और छोड़ें। प्लेसमेंट को ठीक करें। वह सब है। XAML अनुभाग में, आप ग्रिड तत्व के लिए उत्पन्न कोड देखेंगे।




हम एप्लिकेशन बनाते हैं और चलाते हैं। और एक समान दृश्य का आनंद लें:


इस ट्यूटोरियल के लिए वीडियो




स्रोत कोड


गीथूब पर

Source: https://habr.com/ru/post/In203820/


All Articles