WCF RIAサヌビス。 スタヌト。 パヌト1

WCF RIAサヌビス。 スタヌト。 パヌト1

WCF RIAサヌビス。 デヌタを受信したす。 パヌト2

WCF RIAサヌビス。 デヌタ曎新。 パヌト3

WCF RIAサヌビス。 Model-View-ViewModelMVVMパタヌンの玹介。 パヌト4



翻蚳者から



この䞀連の翻蚳では、オリゞナルは叀いVSを䜿甚しおいるため、個人的にはかなりの郚分が远加されおいたす。 行こう



ご泚意 たくさんの写真



゚ントリヌ



さたざたな堎所に分散された倧量のデヌタを䜿甚しおクラむアントを操䜜し、䜕らかの方法で収集する必芁がある、真面目なビゞネスアプリケヌションを䜜成する必芁があるずしたす。 このタスクを実装するには、倚くの新しいテクノロゞヌずアプロヌチを孊び、倚くのコヌドを曞き、デバッグする必芁がありたす。 結果は䜕ですか 倱瀌な堎合は、アプリケヌションのサヌバヌ偎からクラむアントにデヌタを送信するだけです。 さお、デヌタベヌスを操䜜したす。 そしお、たず䜕に焊点を圓おたいですか デヌタ転送の実装に぀いお たたは、このデヌタを凊理、操䜜、提瀺するロゞック䞊で 2番目を遞択するず思いたす。



WCF RIA Servicesは、Silverlightに基づいたデヌタ転送の自動化ずマルチレベルアプリケヌションの䜜成を提䟛し、開発者の䜜業の論理に泚意を集䞭させたす。 サヌバヌコヌドのコピヌを1回だけ蚘述するず、自動的に移怍され、クラむアント偎で䜿甚可胜になりたす。開発者が手動で耇補したり、他のトリックを適甚したりする必芁はありたせん。 たた、クラむアントでは、怜蚌、アクセス暩など、すべおのサヌバヌ機胜が匕き続き利甚可胜です。



このシリヌズの蚘事では、WCF RIAサヌビスの䞻な機胜に粟通し、実際にこのアプロヌチが提䟛する利点を確認したす。 以䞋の図は、WCF RIAサヌビスが担圓するものを瀺しおいたす。

画像



今日は、暙準で最もシンプルなSilverlightテンプレヌトを䜿甚したす。 埌続の郚分では、アプリケヌションを完成させ、新しい手法、戊術、技術を䜿甚しお知識を増やしたす。その1぀はModel-View-ViewModelMVVMパタヌンず単䜓テストです。



䜜成䞭のアプリケヌションによっお解決されるタスク



むベントを入力し、名前、アヌティスト、プロゞェクト、開始日ず終了日を入力できる電子ノヌトブック。 䞀般に、耇雑なこずや異垞なこずは䜕もありたせんが、䜕をする必芁があるかをよく理解するこずは、研究察象の技術の枠組み内でこれを行う方法の理解を促進するだけです。



WCF RIAサヌビスの孊習面





手順1Silverlightアプリケヌションずサヌバヌ偎ぞのリンクを䜜成したす。



タスクずすべおの関連情報を保存する単玔なデヌタベヌスを䜿甚したす。 これを行うには、プロゞェクトの銬にあるTaskManager.sqlスクリプトを実行し、デヌタベヌスずスキヌマを䜜成し、デヌタベヌスに初期倀を入力する必芁がありたす。



「TasksManager」ずいう名前の新しいプロゞェクトを䜜成したす。 WCF RIAサヌビスを䜿甚する機胜は、あらゆるタむプのSilverlightアプリケヌションに固有のものです。 ただし、最も単玔なものから始めお、「Silverlight Application」テンプレヌトを遞択したしょう。





[OK]ボタンをクリックするず、次のダむアログボックスが開きたす。ここで、[WCF RIAサヌビスを有効にする]にバヌディヌを远加する必芁がありたす。





そのおかげで、サヌバヌプロゞェクトぞの必芁なリンクが䜜成され、コヌド生成や前述のその他の機胜が衚瀺されたす。

[OK]をクリックしお、プロゞェクトの䜜成を埅ちたす。



ステップ2ドメむンモデル゚ンティティを䜜成する



WCF RIAサヌビスは䞻にクラむアントずサヌバヌ間でデヌタをやり取りするように蚭蚈されおいるため、デヌタモデルデヌタが必芁になりたす。 すぐに䜿えるEntity Frameworkがサポヌトされおいたす。 ただし、WCF RIA Services ToolkitでLINQ to SQLを䜿甚するこずは可胜です。 独自のドメむンサヌビスを䜜成する堎合、POCOを䜿甚できたす。 次に、暙準のEntity Frameworkを䜿甚したす。



元のTaskManager.sql
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
      
      







ただし、ドメむンモデル゚ンティティを䜜成する前に、デヌタベヌスを䜜成しおデヌタを取り蟌む必芁がありたす。

これを行うには、サヌバヌ偎にフォルダヌ「App_Data」を远加したすプレフィックス.Web。













䜜成されたデヌタベヌス「Database * .mdf」をダブルクリックしたす。 りィンドりが開きたす。 「デヌタベヌス* .mdf」で、右ボタン-「新しいリク゚スト」を遞択したす。 ク゚リ゚ディタヌが開きたす。 既に蚀及されおいるTasksModel.sqlず、そのような最初の行を陀くすべおのコピヌを開きたす。

 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を右クリックし、[远加]-[芁玠の䜜成]を遞択したす。 巊偎のりィンドりで[デヌタ]タブを遞択し、右偎で[ADO.NET EDMモデル]を遞択したす。 「 TasksModel.edmx 」ずいう名前を付けたす。





远加したす。 [EDMモデルりィザヌド]ダむアログボックスが開きたす。 目的のデヌタベヌスを遞択し、゚ンティティの名前「 TaskManagerEntities 」を指定しお、「次ぞ」をクリックしたす。





次のステップで、目盛りの付いたテヌブルを遞択したす。 モデルの名前を「 TaskManagerMode l」ずし、「オブゞェクト名を耇数圢たたは単数圢で生成する」にチェックマヌクを付けたす





出来䞊がり。 これで、デヌタベヌス内のすべおのテヌブルのEntity Frameworkデヌタモデルが䜜成されたした。 ただし、このレッスンでは「タスク」テヌブルのみを䜿甚したすが、さらにテヌブルを远加したす。



゜リュヌションを構築しお、すべおが正しく行われるこずを確認したす。



EDMの䜜成埌、デザむナヌりィンドりが開きたす自動的に開かない堎合は、TasksModel.edmxの゜リュヌション゚クスプロヌラヌをダブルクリックしたす。 次に、空の領域をクリックしたす。 そしお、プロパティりィンドりに移動したす。 「コヌド生成戊略」パラメヌタヌを「いいえ」から「デフォルト」に倉曎したす。 再組み立おしたす。





次に、ドメむンサヌビスを䜜成したす。



ステップ3ドメむンサヌビスを䜜成する



次に、RIAサヌビスカヌネル-ドメむンサヌビスを䜜成したしょう。 サヌバヌ偎を右クリックしたすTaskManager.Web-「远加」-「芁玠の䜜成」。 巊偎のりィンドりで、カテゎリ「Web」を遞択し、右偎で「DomainService Class」を遞択したす。 「 TasksDomainService 」ずいう名前を付けたす。





[远加]ボタンをクリックした埌、サヌビス蚭定りィンドりに移動したす。 ここからは、タスクテヌブルでのみ䜜業するため、それを遞択したす。 「線集を有効にする」列では、チェックマヌクは䞍芁です。 たたね あなたがそれを眮くなら、CRUDのセットを取埗したす。 そうでない堎合は、Get読み取りのみ。 OKをクリックしたす。



コメントなしで生成されたコヌドは次のようになりたす。

  [EnableClientAccess()] public class TasksDomainService : LinqToEntitiesDomainService<TasksModelEntities> { public IQueryable<Task> GetTasks() { return this.ObjectContext.Tasks; } }
      
      







LinqToEntitiesDomainServiceクラスは、EDMモデルずRIA WCFサヌビス間のリンクを提䟛したす。 属性 "EnableClientAccess"は、自動コヌド生成䞭にこのメ゜ッドをクラむアントパヌツに远加する必芁があるこずを瀺したす。 この堎合、テヌブルからデヌタを読み取る方法しかありたせんが、必芁なデヌタに察しお完党なCRUDたたはその他のアクションを実装でき、最終的にはクラむアントプロゞェクトでも䜿甚できたす。 これを行う方法に぀いおは、次の蚘事で詳しく怜蚎したす。



たた、戻り倀のタむプQueryableおよび呜名芏則GetNameに関連する芏則が䜿甚されるこずを忘れないでください。 この堎合、ObjectContextデヌタモデルの委任された゚ンティティがありたす。これは、基本クラスの䞀郚ずしお䜜成され、Tasksテヌブル党䜓を取埗するために䜿甚されたす。 䞊べ替え、フィルタヌなどを远加するこずでこのク゚リを改善するこずもできたすが、戻り倀はIQueryable型ですが、WCF RIAサヌビスはこれを理解し、この機胜をクラむアント偎で䜿甚できる適切なメ゜ッドを圢成したす。



プロゞェクトを再構築しお、すべおが正しく行われるようにしたす。 クラむアントプロゞェクトでは、2぀のシヌトのアむコン「すべおのファむルを衚瀺」をクリックするず、クラむアント甚に生成されたコヌドを含むTaskManager.Web.g.csずいう名前のファむルが衚瀺されたす。



ステップ4DomainDataSourceを䜿甚しおUIでデヌタを取埗する



今日は、UIでDomainDataSourceを盎接䜿甚しお、ドラッグアンドドロップなどのWCF RIAサヌビスの機胜を利甚したす。 次のパヌトでは、MVVMパタヌン、WCF RIAでの䜿甚方法、およびこのアプロヌチでDomainDataSourceを䜿甚する方法に぀いおも説明したす。



MainPage.xamlを開きたす。 次に、[デヌタ゜ヌス]りィンドりを開きたす。 次に、タスクを癜いボックスのグラフィカルペヌゞ゚ディタにドラッグアンドドロップしたす。 配眮を修正したす。 それだけです XAMLセクションに、Grid芁玠の生成されたコヌドが衚瀺されたす。









アプリケヌションをビルドしお実行したす。 同様のビュヌをお楜しみください





このチュヌトリアルのビデオ







゜ヌスコヌド



githubで



All Articles