Я использую механизм «Соглашения по умолчанию», который обеспечивает StructureMap, чтобы избежать необходимости индивидуальной настройки каждого интерфейса. Ниже приведен код, который я использую для этой работы:
My Global.asax имеет эту строку в Application_Start (которая использует фабрику StructureMap из MvcContrib):
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ObjectFactory.Initialize(x =>
{
x.AddRegistry(new RepositoryRegistry());
});
ControllerBuilder.Current.SetControllerFactory(typeof(StructureMapControllerFactory));
}
И класс RepositoryRegistry выглядит так:
public class RepositoryRegistry : Registry
{
public RepositoryRegistry()
{
Scan(x =>
{
x.Assembly("MyAssemblyName");
x.With<DefaultConventionScanner>();
});
}
}
DefaultConventionScanner ищет пары интерфейсов / классов, которые следуют соглашению имен ISomethingOrOther и SomethingOrOther, и автоматически связывает последний как конкретный тип для первого интерфейса.
Если вы не хотите использовать этот механизм соглашения по умолчанию, то вы добавили бы код в классе Registry, чтобы привязать карту каждого интерфейса к конкретным типам с помощью следующего синтаксиса:
ForRequestedType<ISomethingOrOther>().TheDefaultIsConcreteType<SomethingOrOther>();