This post presents some useful suggestions for the Visual Studio Solution structure to use in BizTalk development. It is based on a copy from http://www.novaenterprisesystems.com. But this site is no longer available.
Generally I like to break my solutions up into the seven projects show below. I find that this meets the needs of most solutions, but it is not a hard fast rule. Some solutions will have more, others less, but each project is explained below.
External Schemas (.xsd files)
This project contains all of the schemas that are sent or received by the BizTalk solution. Port level mapping ensures no dependencies are leaked into or out of the BizTalk implementation. This would include schemas generated by adapter wizards, SOAP references, etc. It is vital that these be treated as what they really are: external artifacts (i.e. external dependencies).
Schemas (.xsd files)
The Schemas project contains all the schemas used internally by a BizTalk solution. These are schemas that are never exposed to any other systems and would be used to define entities within the actual solution. Every external schema should have a corresponding internal schema or translate to part of a composite schema.
Maps (.btm files)
The Maps project contains all maps within the solution. It references the Schemas and External Schemas projects and nothing else (with the exception of custom functoid assemblies). This is the guardian that prevents external dependencies from permeating a BizTalk solution.
Pipelines (.btp files)
All pipeline components (assemblers and disassemblers) are grouped in this project to make testing and maintenance easier. This project should reference the External Schemas project and /or the Schemas project if needed. Alternatively if you want to provide slightly more robust isolation you could create internal and external pipeline projects, but I really only recommend this if you need to call a Pipeline from within an Orchestration to avoid leaking a dependency into your Orchestrations layer.
Orchestrations (.odx files)
This project contains all Orchestrations used in the solution. It references the Schemas project and possibly the Pipelines project (if you’re using pipelines from within an Orchestration). Workflows can also exist in this assembly in BizTalk 2009.
Library (C#, resources, etc)
Any artifacts that are used by your solution should also be broken into their own projects. It is important to not let these bleed dependencies into your solution. If you have some custom components to do processing in an orchestration and some for custom functiods or pipeline components these should be broken into their own distinct projects.
Testing (.xml, .dtd, .cs files)
This project hosts all Unit and Functional tests and their supporting data. The only direct references should be to the utilities assembly and to the testing frameworks (e.g. NUnit and BizUnit). This also ensures a clean separation of tests and artifacts from the other parts of a solution.
Non Project Artifacts
There are also several Solution level folders I like to use to organize my solutions. These generally are:
- 3rdParty Assemblies – for storing any external assemblies and components the solution may need to utilize.
- Bindings – to store deployment bindings used in each of the environments you will have in your solution. I generally have Local Development, Integration, UAT, and Production.
- Build – used to hold build scripts.
Relative Path Locations
Always use relative path locations for all artifacts including:
- Keys used to sign assemblies
- References to other assemblies (i.e. project references not absolute references)
- Paths of test files
This will make it easier to build the solution on multiple machines and also make it easier to use a CI server to perform automated building of the solution.
Remember not all solutions will have these seven; some will have less others more, but keep in mind the separation of concerns brought up in the discussion about layers in a BizTalk solution. Later on I’ll cover some specific examples of when to combine which parts of this guidance.
It is natural and healthy to ask why go through all this trouble (ignore that creating projects in a solution is very simple; even more so with a template). Earlier I mentioned the need to control dependencies and this is a certain way to do that, but there are other reasons as well. You may find yourself needing to update in-flight Orchestrations or Maps in a solution with such Orchestrations. Perhaps it’s a simple fix and you haven’t quite worked out you versioning strategy. With separate assemblies you are free to deploy just the changes necessary rather than all assemblies and artifacts at once.
Perhaps more importantly you are also free to create packages that are specific to the type of server you are deploying them to. If you are working in a large BizTalk environment you may have a dozen or more servers partitioned by their functional role. You may want to create deployment packages for each role. This goes back to the previous discussion about Layers vs. Tiers. Building solutions in a separable manner is a good practice that allows administrators and operators more control over the solution once it is out of development. This is critical to the success of any enterprise software system and even more so to BizTalk solutions.