{"id":1384,"date":"2011-10-24T16:37:14","date_gmt":"2011-10-24T23:37:14","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=1384"},"modified":"2014-03-03T20:54:23","modified_gmt":"2014-03-04T04:54:23","slug":"publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/","title":{"rendered":"Publicando providers durante o registro din\u00e2mico de DataSnap Server Class"},"content":{"rendered":"<p>J\u00e1 faz algum tempo que publiquei aqui no blog sobre registro de <a href=\"http:\/\/www.andreanolanusse.com\/pt\/registrando-datasnap-server-class-em-tempo-de-execucao-no-delphi\/\">DataSnap Server Class em tempo de execu\u00e7\u00e3o<\/a>, neste mesmo post surgiu v\u00e1rios coment\u00e1rios relacionados a n\u00e3o publica\u00e7\u00e3o dos Provider parte do ServerModule, o c\u00f3digo original ao registrar o DSServerClass publicava apenas m\u00e9todos (Server methods), mas n\u00e3o os Providers.<\/p>\n<p>A solu\u00e7\u00e3o para este problema \u00e9 bem simples, basta registrar a classe\u00a0TDSProviderDataModuleAdapter, a qual \u00e9 usada internamente para permitir que o Provider esteja vis\u00edvel para os clientes DataSnap. TDSProviderDataModuleAdapter atua como um proxy entre TProviderDataModule no lado servidor e o TDSProviderConnection no lado cliente.<\/p>\n<p>Poder\u00edamos apenas mudar a implementa\u00e7\u00e3o do m\u00e9todo GetDSClass conforme abaixo, isso funcionaria, mas n\u00e3o seria a melhor implementa\u00e7\u00e3o visto que estariamos sempre publicando os m\u00e9todos da interface IAppServer utilizados pelo Provider e ClientDataSet, n\u00e3o faz sentido publicar esta interface se n\u00e3o h\u00e1 provider no ServerModule.<\/p>\n<p>Tornar a publica\u00e7\u00e3o parametriz\u00e1vel traz maior flexbilidade e controle para a aplica\u00e7\u00e3o e para o desenvoldedor, fica a seu crit\u00e9rio quando publicar ou n\u00e3o os providers, assim sendo precisamos apenas de um novo par\u00e2metro na classe TSimpleServerClass.<\/p>\n<pre class=\"brush: delphi\">function TSimpleServerClass.GetDSClass: TDSClass;\r\nbegin\r\n  Result := TDSClass.Create(FPersistentClass, False);\r\n  Result := TDSClass.Create(TDSProviderDataModuleAdapter, Result)\r\nend;<\/pre>\n<p>Abaixo temos o c\u00f3digo atualizado, a \u00fanica altera\u00e7\u00e3o foi no constructor que recebeu o novo par\u00e2metro ExposeProvider, desta forma voc\u00ea decide se quer ou n\u00e3o publicar os providers.<\/p>\n<pre class=\"brush: delphi highlight: [18,19,20,21,31,41,42]\">type\r\n\r\nunit SimpleServerClass;\r\n\r\ninterface\r\n\r\nuses DSServer, Classes, DSCommonServer, DSReflect;\r\n\r\ntype\r\n\r\n  TSimpleServerClass = class(TDSServerClass)\r\n  private\r\n    FPersistentClass: TPersistentClass;\r\n    FExposeProvider : Boolean;\r\n  protected\r\n    function GetDSClass: TDSClass; override;\r\n  public\r\n    constructor Create(AOwner: TComponent; AServer: TDSCustomServer;\r\n      AClass: TPersistentClass; ExposeProvider: Boolean; ALifeCycle: String);\r\n      reintroduce; overload;\r\n  end;\r\n\r\nimplementation\r\n\r\nconstructor TSimpleServerClass.Create(AOwner: TComponent;\r\n  AServer: TDSCustomServer; AClass: TPersistentClass; ExposeProvider: Boolean;\r\n  ALifeCycle: String);\r\nbegin\r\n  inherited Create(AOwner);\r\n  FPersistentClass := AClass;\r\n  FExposeProvider  := ExposeProvider;\r\n  Self.Server := AServer;\r\n  Self.LifeCycle := ALifeCycle;\r\n\r\nend;\r\n\r\nfunction TSimpleServerClass.GetDSClass: TDSClass;\r\nvar\r\n  isAdapted : Boolean;\r\nbegin\r\n  isAdapted := FPersistentClass.InheritsFrom(TProviderDataModule);\r\n  Result := TDSClass.Create(FPersistentClass, isAdapted);\r\n  if FExposeProvider and isAdapted then\r\n     Result := TDSClass.Create(TDSProviderDataModuleAdapter, Result)\r\nend;\r\n\r\nend.<\/pre>\n<p>Abaixo um exemplo onde s\u00e3o registradas 3 classes e somente uma delas exp\u00f5e os Providers:<\/p>\n<pre class=\"brush: delphi\">procedure RegisterServerClasses(AOwner: TComponent; AServer: TDSServer);\r\nbegin\r\n  Assert(AServer.Started = false, 'N\u00e3o \u00e9 poss\u00edvel adicionar classes com o servidor ativo');\r\n\r\n  TSimpleServerClass.Create(AOwner, AServer, TGlobal, False, TDSLifeCycle.Server);\r\n  TSimpleServerClass.Create(AOwner, AServer, TCustomer, True, TDSLifeCycle.Session);\r\n  TSimpleServerClass.Create(AOwner, AServer, TObjectPool, False, TDSLifeCycle.Invocation);\r\nend;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e1 faz algum tempo que publiquei aqui no blog sobre registro de DataSnap Server Class em tempo de execu\u00e7\u00e3o, neste mesmo post surgiu v\u00e1rios coment\u00e1rios relacionados a n\u00e3o publica\u00e7\u00e3o dos Provider parte do ServerModule, o c\u00f3digo original ao registrar o DSServerClass publicava apenas m\u00e9todos (Server methods), mas n\u00e3o os Providers. A solu\u00e7\u00e3o para este problema [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[102],"tags":[23,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Publicando providers durante o registro din\u00e2mico de DataSnap Server Class | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"J\u00e1 faz algum tempo que publiquei aqui no blog sobre registro de DataSnap Server Class em tempo de execu\u00e7\u00e3o, neste mesmo post surgiu v\u00e1rios coment\u00e1rios\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Publicando providers durante o registro din\u00e2mico de DataSnap Server Class | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"J\u00e1 faz algum tempo que publiquei aqui no blog sobre registro de DataSnap Server Class em tempo de execu\u00e7\u00e3o, neste mesmo post surgiu v\u00e1rios coment\u00e1rios\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2011-10-24T23:37:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-03-04T04:54:23+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"170\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"2 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"width\":170,\"height\":170},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/\",\"name\":\"Publicando providers durante o registro din\\u00e2mico de DataSnap Server Class | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#primaryimage\"},\"datePublished\":\"2011-10-24T23:37:14+00:00\",\"dateModified\":\"2014-03-04T04:54:23+00:00\",\"description\":\"J\\u00e1 faz algum tempo que publiquei aqui no blog sobre registro de DataSnap Server Class em tempo de execu\\u00e7\\u00e3o, neste mesmo post surgiu v\\u00e1rios coment\\u00e1rios\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Publicando providers durante o registro din\\u00e2mico de DataSnap Server Class\",\"datePublished\":\"2011-10-24T23:37:14+00:00\",\"dateModified\":\"2014-03-04T04:54:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#webpage\"},\"commentCount\":15,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#primaryimage\"},\"keywords\":[\"DataSnap\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1384"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=1384"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1384\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/4202"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=1384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=1384"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=1384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}