BizTalk Server 2006 Business Rules and Static Methods


The Business Rules Engine that ships with BizTalk Server 2006 now supports the usage of static objects without passing that particular object
into the rule as a “fact.” However, a registry change is needed to get it working. Why is this valuable? Now you can build business rules
that only require stateful objects to be passed in as facts, and leave helper functions, lookups and the like as static objects.

I was recently working on setting a timestamp on my XML document from within a business rule. With BizTalk Server 2006’s changes for static
object support, I wanted to use the standard “DateTime.Now” function contained in the mscorlib assembly, without passing an instance of that
object into the rule as a fact. My business rule looked like this:



However, each time I ran it, I got nothing back in my XML node. After a request on our internal distribution list for some guidance, I got
some help from the grand poo-bah of business rules, Jurgen Willis. Apparently the following key is required in the registry:


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\BusinessRules\3.0\StaticSupport (DWORD)





There are three valid values for this key:

  • 0 – This is the default key, and pretty much mimics the behavior of BizTalk Server 2004 where an instance of an object is
    always required as an input fact, and the method is only called when the rule is evaluated or executed.
  • 1 – An instance of the object is NOT required, and the static method is called whenever the rule is evaluated or executed
  • 2 – An instance of the object is NOT required, but the static method will be called at rule translation time (only if the
    parameters are constants). This is primarily meant as a performance optimization. However, note that static members used as actions
    will NOT be executed at translation time, but static methods used as parameters may be.

So obviously in my case, I needed to use keys 1 or 2, with 1 being the only legit choice since for a static method like DateTime.Now, I’d want
it evaluated during execution, not at rule translation!

The key wasn’t present on my machine, so I’m not sure if this is something we’re going to include in the RTM bits. But now you know, and knowing
is half the battle.

Comments (6)

  1. Kevin Farley says:

    Excellent! Thx for the registry spelunking…more on BRE to come!

  2. Marco says:

    I hope it will get into the RTM. But please without the need to go into the registry!

    This would simplify all the type conversion functions!

    Marco

  3. Paul says:

    Great Richard. That’s really helpful. Btw, how do you get a DateTime object listed in facts Explorer? It’s missing when I browse to System namespace in .NET classes tab. I had to create wrapper for it.

  4. rseroter says:

    Paul, Make sure you don’t add the "System" assembly from the "browse" menu for the .NET Fact. Instead, reference the mscorlib assembly, and then you’ll find the DateTime class.