21 Aralık 2023 Perşembe

Örnek DI uygulaması 6 - Displayer'leri kaldırıp bir adet generic displayer oluşturmak.

 Kod kalitemizi bir adım daha ilerleteceğiz. Bu küçük ama projeyi çok sadeleştirecek bir adım olacak. Gördüğümüz gibi her tablomuz için bir TFrame oluşturuyoruz, ancak her TFrame için de onu içinde barındıracak bir zarf oluşturmak zorunda kalıyoruz. Peki bunu bir tane yapıp parametrelerini değiştirerek çalışır hale getirebilir miyiz?

Bu yazının konusu da bu işi yapmak olacak!

Öncelikle View.MyBaseFrame.pas unit'inde şu eklemeyi yapıyoruz. Bu bize daha sonra oluşturacağımız Displpayer'da yardımcı olacak bir tanımlama:

...
  TframeMyBaseClass = class of TframeMyBase;
...
Sonrasında uEntityDisplayer.pas adlı bir unit ekleyelim projeye. İçinde şunlar olacak
unit uEntityDisplayer;

interface
uses System.Classes, uInterfaces, Vcl.Controls, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Forms, View.MyBaseFrame;

type
  TEntityDisplayer<T : TframeMyBase, constructor> = class(TInterfacedObject, IDisplayOnTabSheetGeneric)
  public
    procedure DisplayOnTabSheet(const aTabSheet: TTabSheet);
  end;

implementation

{ TEntityDisplayer }

procedure TEntityDisplayer<T>.DisplayOnTabSheet(const aTabSheet: TTabSheet);
var frm : TFrame;
begin
  frm := T(TframeMyBaseClass(T).Create(Application.MainForm));
  frm.Parent := aTabSheet;
  frm.Align := alClient;
  aTabSheet.Caption := (frm as T).GetCaption;
end;

end.
Diğer 3 adet displayer projeden çıkarılacak ve dosyalar diskten silinecek. Yanlışlıkla onların işlem görmesini istemeyiz.

Son olarak ta uRegistration değiştirilecek

unit uRegistration;

interface

uses
  Spring.Container, uInterfaces;

procedure RegisterInterfaces(aMyConnection : IMyConnection);

implementation
uses
    uEntityDisplayer
   ,View.Inventories
   ,View.Customers
   ,View.Suppliers
    ;

procedure RegisterInterfaces(aMyConnection : IMyConnection);
begin
  GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeInventories>>('inventories');
  GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeCustomers>>('customers');
  GlobalContainer.RegisterType<IDisplayOnTabSheet, TEntityDisplayer<TframeSuppliers>>('suppliers');


  GlobalContainer.RegisterInstance<IMyConnection>(aMyConnection, 'connection');

  GlobalContainer.Build;
end;

end.
Evet bundan sonra F9 yaptığımızda uygulamamız çalışacaktır.

Böylece her ekran için ayrı bir unit ve class oluşturma işinden sıyırmış olduk. Bu bizim daha sonra ekleyeceğimiz ekranlara ilişkin işlemleri hiç değiştirmeye gerek kalmadan yaptığımız bir sadeleştirme oldu.


Projenin bu şeklini şu linkten elde edebilirsiniz : DITest-5
























































Hiç yorum yok:

Yorum Gönder