Хорошим подходом является использование соглашений структурной карты в сочетании с регистрами структурной карты.Это позаботится о большинстве ваших проблем с регистрацией.Structuremap может сканировать ваши bin и map зависимости, которые он находит во всех dll в вашем bin.
Просмотр метода Scan в сочетании с классом RegistryMap Registry:
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory(y =>
y.FullName.StartsWith("JustLookAtTheseDlls"));
// Use default conventions
x.WithDefaultConventions().OnAddedPluginTypes(y =>
y.HybridHttpOrThreadLocalScoped());
//Are there any registries? If so, register them
x.LookForRegistries();
}
Реестр выглядит примерно такэто, и вы можете просто перетащить по одному в каждый из ваших проектов, чтобы зарегистрировать элементы в каждом из них:
public class IocRegistry :
StructureMap.Configuration.DSL.Registry
{
public IocRegistry()
{
For<IDocumentStore>().Singleton()
.Use<RavenStore>();
}
}
В вашем корневом приложении должен быть реестр, содержащий приведенный выше оператор сканирования.Затем инициализируйте структурную карту следующим образом:
ObjectFactory.Configure(x => x.AddRegistry(
new MyTopLevelRegistry()));
Где MyTopLevelRegistry выглядит следующим образом:
public class MyTopLevelRegistry: Registry
{
public MyTopLevelRegistry()
{
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory(
y => y.FullName
.StartsWith("InsertYourNamespacePrefix"));
x.WithDefaultConventions().OnAddedPluginTypes(
y => y.HybridHttpOrThreadLocalScoped());
x.LookForRegistries();
});
}
}
Имейте в виду, если вы установите для него значение «WithDefaultConventions», оно автоматически сопоставит IMyClass с MyClass, чтобы вы моглидаже не нужно указывать этот материал в реестрах.Вам просто нужно зарегистрировать предметы, которые не соответствуют этому соглашению.
Надеюсь, это поможет!