Custom Connection Properties und Listen in Metadaten für DSPIs in BizTalk RFID

Dieses Post ist eine Zusammenfassung aus unseren englischensprachigen Posts zum Thema.

Wir arbeiten an einem Provider für BizTalk RFID und stießen auf eine Situation, wo wir sogenannte "custom connection properties" verwenden wollten, um Informationen anzugeben, wie man sich mit einem DSPI verbinden kann.

 
Diese Properties sollten hier angezeigt werden:

In diesem Kontext werden "custom properties" als "vendor defined" bezeichnet.
Die Dokumentation ist leider derzeit noch nicht ausgereift, daher hoffen wir, dass das folgende anderen Entwicklern helfen wird:

Man muss folgende Methode implementieren, um "custom properties" angeben zu können.:
public static ProviderMetadata GetProviderMetadata()
dabei wird ProviderMetadata durch den ProviderMetadata Konstruktor erzeugt.:
public ProviderMetadata(ProviderInformation providerInformation,
    Collection<ProviderCapability> capabilities,
   
Dictionary<PropertyKey, RfidProviderPropertyMetadata> providerPropertyMetadata,
    Dictionary
<VendorEntityKey, VendorEntityMetadata> vendorExtensionsEntityMetadata,
    Dictionary
<PropertyKey, RfidDevicePropertyMetadata> devicePropertyMetadata);

Derei BizTalk RFID mitgelieferte Acme Beispiel Provider hat einige Code-Segmente, die demonstrieren, was in diesem Kontext notwendig ist.
Von besonderem Interesse ist hier:
public static Collection<ProviderCapability> GetProviderCapabilities()
und
public static Dictionary<VendorEntityKey, VendorEntityMetadata>
                  GetVendorExtensionsEntityMetadata()

Innerhalb GetProviderCapabilities ist folgende Zeile zu beachten:
    acmeCapability.Add(ProviderCapability.VendorDefinedTransport);

während in GetVendorExtensionsEntityMetadata dies genauer betrachtet werden sollte:
    VendorEntityKey key1 = new VendorEntityKey(
                                   typeof(VendorDefinedTransportSettings),
                                   "CustomAcmeTransportSettings"
                                   EntityType.TransportSettings);
und
    VendorEntityKey key2 = new VendorEntityKey(
                               typeof(VendorDefinedTransportSettings), 
                               "Transport2", EntityType.TransportSettings);

Das sollte als Information ausreichen, um es richtig zu machen :)

Im folgenden der komplette Code Extrakt aus dem Acme Beispiel Provider:


 

public static ProviderMetadata GetProviderMetadata()

{

    return new ProviderMetadata(

        AcmeProviderMetaData2.ProviderInformation,

        AcmeProviderMetaData2.GetProviderCapabilities(),

        AcmeProviderMetaData2.GetProviderPropertyMetadata(),

        AcmeProviderMetaData2.GetVendorExtensionsEntityMetadata(),

        AcmeProviderMetaData2.GetDevicePropertyGroupMetadata()); ;

}

//...

//not showing the rest here
//... 

/// <summary>

/// Gets the list of capabilites this provider supports.

/// </summary>

/// <returns>List of provider capabilities</returns>

public static Collection<ProviderCapability> GetProviderCapabilities()

{

    List<ProviderCapability> acmeCapability = new List<ProviderCapability>();

 

    acmeCapability.Add(ProviderCapability.Discovery);

    acmeCapability.Add(ProviderCapability.TcpTransport);

    acmeCapability.Add(ProviderCapability.BluetoothTransport);

    acmeCapability.Add(ProviderCapability.HttpTransport);

    acmeCapability.Add(ProviderCapability.SerialTransport);

    acmeCapability.Add(ProviderCapability.VendorDefinedTransport);

    acmeCapability.Add(ProviderCapability.TriggeredDiscovery);

    acmeCapability.Add(ProviderCapability.ProviderDefunctEvent);

 

    return new Collection<ProviderCapability>(acmeCapability);

}


 

/// <summary>

/// Returns meta data for vendor specific entities like command,response etc.

/// </summary>

/// <returns>Dictionary of vendor entity key vs its meta data</returns>

public static Dictionary<VendorEntityKey, VendorEntityMetadata>
                  GetVendorExtensionsEntityMetadata()

{

    Dictionary<VendorEntityKey, VendorEntityMetadata> vendorData 
                = new Dictionary<VendorEntityKey, VendorEntityMetadata>();

 

    //Transport One

    VendorEntityKey key1 = new VendorEntityKey(
                                   typeof(VendorDefinedTransportSettings),
                                   "CustomAcmeTransportSettings"
                                   EntityType.TransportSettings);

 

    Dictionary<string, VendorEntityParameterMetadata> dict 
                         = new Dictionary<string, VendorEntityParameterMetadata>();

    string host = "127.0.0.1";

 

    VendorEntityParameterMetadata dataForHost
                         = new VendorEntityParameterMetadata(typeof(string),

                                       "Enter the host address as a string",

                                       host, false);

    dict.Add("Host", dataForHost);

 

    VendorEntityParameterMetadata dataForPort 
                         = new VendorEntityParameterMetadata(typeof(int),
                                "Enter the port as an int", 6666, false);

    dict.Add("Port", dataForPort);

 

    VendorEntityMetadata metaData1
                         = new VendorEntityMetadata(
                                "VendorDefinedTransportSettings keys", dict);

 

    //Transport two

    VendorEntityKey key2 = new VendorEntityKey(
                               typeof(VendorDefinedTransportSettings), 
                               "Transport2", EntityType.TransportSettings);

 

    Dictionary<string, VendorEntityParameterMetadata> dict2 
                         = new Dictionary<string, VendorEntityParameterMetadata>();

    string property1 = "test1";

 

    VendorEntityParameterMetadata dataForproperty1 
                     = new VendorEntityParameterMetadata(typeof(string),

                            "Enter the host address as a string",

                            property1,

                            false);

    dict2.Add("property1", dataForproperty1);

 

    VendorEntityMetadata metaData2 = new VendorEntityMetadata(
                                            "Transport2 keys", dict2);

 

 

    vendorData.Add(key1, metaData1);

    vendorData.Add(key2, metaData2);

 

    return vendorData;

}

Das scheint kompliziert? Klar, wir sprechen hier leider davon, Gerätetreiber zu schreiben. :)

Im BizTalk RFID Manager sollte folgendes Ergebnis sichtbar sein:

 
und

 

In manchen Fällen kann es notwendig sein, eine Liste von Werten anzugeben, aus welchen bei der Providerinstallation gewählt werden kann. Das folgende Beispiel zeigt die Erzeugung von zwei Properties. Das erste ist "Copyright" des Typs "string" in der Gruppe "General." Das zweite ist eine Liste von Strings in der Gruppe "DAENET FileWatcher". Dies führt dazu, dass der Administrator einen dieser Werte in der unten angezeigten Listbox auswählen kann. 

private static
Dictionary<PropertyKey, RfidProviderPropertyMetadata>
getDefaultProviderMetadata(){

Dictionary
<PropertyKey, RfidProviderPropertyMetadata> providerMetaData =
new Dictionary<PropertyKey, RfidProviderPropertyMetadata>();


PropertyKey key1 = new PropertyKey("General", "Copyright");
RfidProviderPropertyMetadata metadata1 = new RfidProviderPropertyMetadata(typeof(string),
"Copyright", "DAENET 2005-2007", true, false, false);
providerMetaData.Add(key1, metadata1);

PropertyKey sensorTypeKey = new PropertyKey("DAENET FileWatcher", "SensorType");
Collection<object> collection = new Collection<object>();
collection.Add(SensorType.RfidTag.ToString());
collection.Add(SensorType.PressureSensor.ToString());
collection.Add(SensorType.TemperatureSensor.ToString());


RfidProviderPropertyMetadata sensorTypeMetaData =
new RfidProviderPropertyMetadata(typeof(string),
"Sensor Type to be simulated", SensorType.RfidTag.ToString(),
false, false, false, collection);


providerMetaData.Add(sensorTypeKey, sensorTypeMetaData);

return providerMetaData;

}


Posted May 04 2007, 10:40 PM by Andreas Erben
developers.de is a .Net Community Blog powered by daenet GmbH.