GitObjectDB menyederhanakan versi manajemen konfigurasi dengan mendukungnya di git.
| Nama | Lencana |
|---|---|
| Gitobjectdb | |
| Gitobjectdb.systemTextJson | |
| Gitobjectdb.yamldotnet | |
| Gitobjectdb.api.odata | |
| Gitobjectdb.api.graphql | |
| Gitobjectdb.api.protobuf | |
| Gitobjectdb.api.protobuf.model |
GitObjectDB dirancang untuk menyederhanakan versi manajemen konfigurasi. Ia melakukannya dengan menghapus kebutuhan untuk pengkode tangan perintah yang diperlukan untuk berinteraksi dengan git.
Repositori Git digunakan sebagai database murni karena file yang berisi salinan objek yang diserialkan tidak pernah diambil dalam sistem file. GitObjectDB hanya menggunakan penyimpanan gumpalan yang disediakan oleh Git.
Inilah contoh sederhana:
[ GitFolder ( "Applications" ) ]
public record Application : Node
{
public string Name { get ; init ; }
public string Description { get ; init ; }
}
[ GitFolder ( "Pages" ) ]
public record Table : Node
{
public string Name { get ; init ; }
public string Description { get ; init ; }
[ StoreAsSeparateFile ( Extension = "txt" ) ]
public string ? RichContent { get ; init ; }
} var existingApplication = connection . Lookup < Application > ( "main" , "applications" , new UniqueId ( id ) ) ;
var newTable = new Table { .. . } ;
connection
. Update ( "main" , c => c . CreateOrUpdate ( newTable , parent : existingApplication ) )
. Commit ( new ( "Added new table." , author , committer ) ) ; var node = new SomeNode
{
SomeProperty = "Value stored as json" ,
RichContent = "Value stored as raw text in separate Git blob, next to primary one" ,
} :... disimpan di git sebagai berikut:
{
"$type" : " Sample.SomeNode " ,
"id" : " zerzrzrz " ,
"someProperty" : " Value stored as json "
} Value stored many dynamic resources in separate Git blob, next to primary one
Anda juga dapat menyimpan sumber daya sebagai file terpisah:
new Resource ( node , "Some/Folder" , "File.txt" , new Resource . Data ( "Value stored in a separate file in <node path>/Resources/Some/Folder/File.txt" ) ) ; connection
. Update ( "main" , c => c . CreateOrUpdate ( table with { Description = newDescription } ) )
. Commit ( new ( "Some message" , signature , signature ) ) ;
connection . Checkout ( "newBranch" , "main~1" ) ;
connection
. Update ( "main" , c => c . CreateOrUpdate ( table with { Name = newName } ) )
. Commit ( new ( "Another message" , signature , signature ) ) ; var comparison = connection . Compare ( "main~5" , "main" ) ;
var nodeChanges = comparison . Modified . OfType < Change . NodeChange > ( ) ; Referensi Node Memungkinkan menghubungkan node yang ada di repositori:
public record Order : Node
{
public Client Client { get ; set ; }
// ...
}
public record Client : Node
{
// ...
}
// Nodes get loaded with their references (using a shared )
var cache = new Dictionary < DataPath , ITreeItem > ( ) ;
var order = connection . GetNodes < Order > ( "main" , referenceCache : cache ) . First ( ) ;
Console . WriteLine ( order . Client . Id ) ; // main: A---B A---B
// ->
// newBranch: C C---x
connection
. Update ( "main" , c => c . CreateOrUpdate ( table with { Description = newDescription } ) )
. Commit ( new ( "B" , signature , signature ) ) ;
connection . Repository . Branches . Add ( "newBranch" , "main~1" ) ;
connection
. Update ( "newBranch" , c => c . CreateOrUpdate ( table with { Name = newName } ) )
. Commit ( new ( "C" , signature , signature ) ) ;
sut . Merge ( upstreamCommittish : "main" ) ; Bayangkan sebuah skenario di mana Anda mendefinisikan dalam kode Anda tipe pertama:
[ GitFolder ( FolderName = "Items" , UseNodeFolders = false ) ]
[ IsDeprecatedNodeType ( typeof ( SomeNodeV2 ) ) ]
private record SomeNodeV1 : Node
{
public int Flags { get ; set ; }
}
[ GitFolder ( FolderName = "Items" , UseNodeFolders = false ) ]
private record SomeNodeV2 : Node
{
public BindingFlags TypedFlags { get ; set ; }
} Anda kemudian ingin memperkenalkan perubahan baru sehingga properti Flags berisi informasi yang lebih bermakna, mengandalkan enum:
[ GitFolder ( FolderName = "Items" , UseNodeFolders = false ) ]
private record SomeNodeV2 : Node
{
public BindingFlags TypedFlags { get ; set ; }
} Yang perlu Anda lakukan adalah #1 menambahkan atribut [IsDeprecatedNodeType(typeof(SomeNodeV2))] . Ini akan menginstruksikan deserializer untuk mengonversi node ke versi baru, menggunakan konverter. Konverter #2 perlu disediakan dalam model. Anda dapat menggunakan Automapper atau alat lain untuk kenyamanan Anda.
[ GitFolder ( FolderName = "Items" , UseNodeFolders = false ) ]
[ IsDeprecatedNodeType ( typeof ( SomeNodeV2 ) ) ]
private record SomeNodeV1 : Node
{
// ...
}
var model = new ConventionBaseModelBuilder ( )
. RegisterType < SomeNodeV1 > ( )
. RegisterType < SomeNodeV2 > ( )
. AddDeprecatedNodeUpdater ( UpdateDeprecatedNode )
. Build ( ) ;
Node UpdateDeprecatedNode ( Node old , Type targetType )
{
var nodeV1 = ( SomeNodeV1 ) old ;
return new SomeNodeV2
{
Id = old . Id ,
TypedFlags = ( BindingFlags ) nodeV1 . Flags ,
} ;
}Lihat dokumentasi.
Lisensi MIT (lihat file lisensi).