By default all assemblies in the endpoint bin directory are scanned to find types implementing its interfaces so that it can configure them automatically.
NServiceBus.Core.dll) is automatically included since it is required for endpoints to properly function.
There are some cases where finer control over which assemblies are loaded is required:
- To limit the number of assemblies being scanned and hence provide improvements to startup time.
- If hosting multiple endpoints out of the same directory each endpoint may require a subset of assemblies to be loaded.
NServiceBus.RavenDB.dll) are not considered a core assembly and will need to be included when customizing assembly scanning.
Assemblies in nested directories are scanned.
An "Include a list" approach is used. This proved to be problematic. Many extensions rely on assembly scanning, for example transports and persistences in external NuGet packages. If, at endpoint configuration time, a list of assemblies was generated, and that list did not include extension assemblies, the endpoint would fail at runtime with some unexpected and hard to diagnose behaviors.
var excludesBuilder = AllAssemblies .Except("MyAssembly1.dll") .And("MyAssembly2.dll"); Configure.With(excludesBuilder);
var allTypes = from a in AllAssemblies.Except("Dummy") from t in a.GetTypes() select t; var allowedTypesToScan = allTypes .Where(t => t != typeof(GenericHandler)) .ToList(); Configure.With(allowedTypesToScan);
Configure.With(myListOfAssemblies); // or Configure.With(assembly1, assembly2);
var includesBuilder = AllAssemblies .Matching("NServiceBus") .And("MyCompany.") .And("SomethingElse"); Configure.With(includesBuilder);
AllAssemblies helper class can be used to create a list of assemblies either by creating a blacklist using the method
Except or a whitelist by using Matching or a combination of both.
Andmethods behave like
var excludesBuilder = AllAssemblies .Matching("NServiceBus") .And("MyCompany.") .Except("BadAssembly.dll"); Configure.With(excludesBuilder);