TypeBuilder
TypeBuilderRequest is a request to create a TypeBuilder.
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType1");
// Create type builder
TypeBuilder typeBuilder = service.GetRequired<IRequestFor<TypeBuilder>, TypeBuilder>(typeBuilderRequest);
TypeAttributes and Attributes can be attached as argument.
// Create request for type builder with type attributes
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(
nameRequest: "MyType2",
typeAttributes: TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass,
attributes: new object[] { new DataContractAttribute { IsReference = false } },
moduleBuilder: null,
baseType: null);
// Request for type
IRequestFor<Type> typeRequest = typeBuilderRequest.Build();
Building
TypeRequest is a request to build a new type or seek already built type.
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType5");
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create type
Type typeA = service.GetRequired<IRequestFor<Type>, Type>(typeRequest);
Instance
NewRequest is a request to create an instance of type.
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType6");
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = new NewRequest(typeRequest, Parameters: null);
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
.NewRequest() extension method also creates same request.
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
View complete request
NewRequest └── Type = TypeRequest └── Name = TypeBuilderRequest └── Name = "MyType6"
AssemblyBuilder
'moduleBuilder:' specifies the module and assembly builder. If AssemblyBuilderRequest indicates a builder by name, then builder searched from service cache, and if one not found then new assembly builder is created.
// Create Assembly request
IRequestFor<AssemblyBuilder> assemblyBuilderRequest = new AssemblyBuilderRequest("DynamicAssembly");
// Create ModuleBuilder request
IRequestFor<ModuleBuilder> moduleBuilderRequest = new ModuleBuilderRequest(assemblyBuilderRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3", moduleBuilder: moduleBuilderRequest);
An explicit reference to a ModuleBuilder can also be provided.
// Get ModuleBuilder
ModuleBuilder moduleBuilder = ModuleBuilderSingleton.Instance;
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType4", moduleBuilder: moduleBuilder);
If no module builder is provided, then handler requests for default instance, which reverts to ModuleBuilderSingleton.Instance.
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3B", moduleBuilder: null);
If another IService is constructed with different cache, then a different assembly builder is created for both caches. Each creates their own Type-references even if name and request is same.
// Create service1
IService service1 = Services.Create(Avalanche.Emit.Module.Instance);
// Create service2
IService service2 = Services.Create(Avalanche.Emit.Module.Instance);
// Create Assembly request
IRequestFor<AssemblyBuilder> assemblyBuilderRequest = new AssemblyBuilderRequest("DynamicAssembly");
// Create ModuleBuilder request
IRequestFor<ModuleBuilder> moduleBuilderRequest = new ModuleBuilderRequest(assemblyBuilderRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3C", moduleBuilder: moduleBuilderRequest);
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create types
Type type1 = service1.GetRequired<IRequestFor<Type>, Type>(typeRequest);
Type type2 = service2.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// Not same type reference
Console.WriteLine(Object.ReferenceEquals(type1, type2)); // = FALSE
By not providing a 'moduleBuilder' the default AssemblyBuilder.Instance is used, which ensures that only one Type is created.
// Create service1
IService service1 = Services.Create(Avalanche.Emit.Module.Instance);
// Create service2
IService service2 = Services.Create(Avalanche.Emit.Module.Instance);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3D", moduleBuilder: null);
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create types
Type type1 = service1.GetRequired<IRequestFor<Type>, Type>(typeRequest);
Type type2 = service2.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// Same type reference
Console.WriteLine(Object.ReferenceEquals(type1, type2)); // = TRUE
Derived Name
Avalanche.Service.Utilities contains string handing utilities that can be used for deriving type name from its own request.
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
HashCodeRequest idRequest = new HashCodeRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> instanceRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(instanceRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
If same request is issed to another service, same type name is generated. Though, the name is different at next run of the application.
// Create another service
IService service2 = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Create another instance from same request
object instance2 = service.GetRequired<IRequestFor<object>, object>(instanceRequest);
// Print type
Console.WriteLine(instance2.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
View complete request
NewRequest └── Type = TypeRequest └── Key = TypeBuilderRequest └── Name = StringFormatRequest ├── Format = "Avalanche.Runtime.Type-{0:X8}" └── Parameters[0] = HashCodeRequest └── Source = TypeBuilderRequest
Different requests provide diffent hashcode and name.
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
HashCodeRequest idRequest = new HashCodeRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Add ToString -method (NEW!)
typeBuilderRequest = typeBuilderRequest.Append(ToStringRequest.Create("Hello World!"));
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-52E6EC04"
Another way to derive object id is with ObjectIdRequest.
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
ObjectIdRequest idRequest = new ObjectIdRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
Full Example
Full example
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Serialization;
using Avalanche.Emit;
using Avalanche.Service;
using Avalanche.Utilities;
public class typebuilder
{
public static void Run()
{
{
// <01>
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType1");
// Create type builder
TypeBuilder typeBuilder = service.GetRequired<IRequestFor<TypeBuilder>, TypeBuilder>(typeBuilderRequest);
// </01>
// Print request
Console.WriteLine(typeBuilderRequest.PrintTree());
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <02>
// Create request for type builder with type attributes
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(
nameRequest: "MyType2",
typeAttributes: TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass,
attributes: new object[] { new DataContractAttribute { IsReference = false } },
moduleBuilder: null,
baseType: null);
// Request for type
IRequestFor<Type> typeRequest = typeBuilderRequest.Build();
// </02>
// Create type
Type type = service.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// Print request
Console.WriteLine(typeBuilderRequest.PrintTree());
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <03>
// Create Assembly request
IRequestFor<AssemblyBuilder> assemblyBuilderRequest = new AssemblyBuilderRequest("DynamicAssembly");
// Create ModuleBuilder request
IRequestFor<ModuleBuilder> moduleBuilderRequest = new ModuleBuilderRequest(assemblyBuilderRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3", moduleBuilder: moduleBuilderRequest);
// </03>
// Create type builder
TypeBuilder typeBuilder = service.GetRequired<IRequestFor<TypeBuilder>, TypeBuilder>(typeBuilderRequest);
// Print request
Console.WriteLine(typeBuilderRequest.PrintTree());
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <3B>
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3B", moduleBuilder: null);
// </3B>
// Create type builder
TypeBuilder typeBuilder = service.GetRequired<IRequestFor<TypeBuilder>, TypeBuilder>(typeBuilderRequest);
// Print request
Console.WriteLine(typeBuilderRequest.PrintTree());
}
{
// <3C>
// Create service1
IService service1 = Services.Create(Avalanche.Emit.Module.Instance);
// Create service2
IService service2 = Services.Create(Avalanche.Emit.Module.Instance);
// Create Assembly request
IRequestFor<AssemblyBuilder> assemblyBuilderRequest = new AssemblyBuilderRequest("DynamicAssembly");
// Create ModuleBuilder request
IRequestFor<ModuleBuilder> moduleBuilderRequest = new ModuleBuilderRequest(assemblyBuilderRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3C", moduleBuilder: moduleBuilderRequest);
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create types
Type type1 = service1.GetRequired<IRequestFor<Type>, Type>(typeRequest);
Type type2 = service2.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// Not same type reference
Console.WriteLine(Object.ReferenceEquals(type1, type2)); // = FALSE
// </3C>
}
{
// <3D>
// Create service1
IService service1 = Services.Create(Avalanche.Emit.Module.Instance);
// Create service2
IService service2 = Services.Create(Avalanche.Emit.Module.Instance);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType3D", moduleBuilder: null);
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create types
Type type1 = service1.GetRequired<IRequestFor<Type>, Type>(typeRequest);
Type type2 = service2.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// Same type reference
Console.WriteLine(Object.ReferenceEquals(type1, type2)); // = TRUE
// </3D>
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <04>
// Get ModuleBuilder
ModuleBuilder moduleBuilder = ModuleBuilderSingleton.Instance;
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType4", moduleBuilder: moduleBuilder);
// </04>
// Create type builder
TypeBuilder typeBuilder = service.GetRequired<IRequestFor<TypeBuilder>, TypeBuilder>(typeBuilderRequest);
// Print request
Console.WriteLine(typeBuilderRequest.PrintTree());
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <05>
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType5");
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create type
Type typeA = service.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// </05>
// Print request
Console.WriteLine(typeRequest.PrintTree());
// <5B>
// Create type
Type typeB = service.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// </5B>
// <5C>
// Create service
IService service2 = Services.Create(Avalanche.Emit.Module.Instance);
// Create type
Type typeC = service2.GetRequired<IRequestFor<Type>, Type>(typeRequest);
// </5C>
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// <06>
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType6");
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = new NewRequest(typeRequest, Parameters: null);
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// </06>
// Print request
Console.WriteLine(newRequest.PrintTree());
}
{
// Create service
IService service = Services.Create(Avalanche.Emit.Module.Instance);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest("MyType7");
// <07>
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
// </07>
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Print request
Console.WriteLine(newRequest.PrintTree());
}
{
// <08>
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
HashCodeRequest idRequest = new HashCodeRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> instanceRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(instanceRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
// </08>
// <8B>
// Create another service
IService service2 = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Create another instance from same request
object instance2 = service.GetRequired<IRequestFor<object>, object>(instanceRequest);
// Print type
Console.WriteLine(instance2.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
// </8B>
// Print request
Console.WriteLine(instanceRequest.PrintTree());
}
{
// <8C>
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
HashCodeRequest idRequest = new HashCodeRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Add ToString -method (NEW!)
typeBuilderRequest = typeBuilderRequest.Append(ToStringRequest.Create("Hello World!"));
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-52E6EC04"
// </8C>
}
{
// <8D>
// Create service
IService service = Services.Create((Avalanche.Emit.Module.Instance, Avalanche.Service.Utilities.Module.Instance));
// Request to calculate hash
ObjectIdRequest idRequest = new ObjectIdRequest();
// Request to derive type name
IRequestFor<string> typeNameRequest = new StringFormatRequest("Avalanche.Runtime.Type-{0:X8}", idRequest);
// Create request for type builder
IRequestFor<TypeBuilder> typeBuilderRequest = new TypeBuilderRequest(typeNameRequest);
// Assign source of hashing
idRequest.Source = typeBuilderRequest;
// Create request for type
IRequestFor<Type> typeRequest = new TypeRequest(typeBuilderRequest);
// Create request for instance
IRequestFor<object> newRequest = typeRequest.NewRequest();
// Create instance
object instance = service.GetRequired<IRequestFor<object>, object>(newRequest);
// Print type
Console.WriteLine(instance.GetType().FullName); // "Avalanche.Runtime.Type-301BABB5"
// </8D>
}
}
}