Я решил использовать StructureMap
для своего приложения.Вот что я сделал, чтобы заставить его работать:
Создайте свой собственный класс CustomFactory:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(controllerType);
}
try
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException ex)
{
throw;
}
}
}
Создайте загрузчик, используя соглашение StructureMap, чтобы зарегистрировать все интерфейсы и его реализацию для моегосборка.(Я разместил в этом блоге сообщение ):
public class StructureMapBootstrapper : IBootstrapper
{
private static bool hasStarted;
public void BootstrapStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<FactoryRegistry>();
});
}
public static void Restart()
{
if (hasStarted)
{
ObjectFactory.ResetDefaults();
}
else
{
Bootstrap();
hasStarted = true;
}
}
public static void Bootstrap()
{
new StructureMapBootstrapper().BootstrapStructureMap();
}
}
public class FactoryRegistry : Registry
{
public FactoryRegistry()
{
Scan(s =>
{
s.Assembly("Calendar.Library");
s.TheCallingAssembly();
s.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "").ToLower());
s.WithDefaultConventions();
});
}
}
Зарегистрируйте StructureMap в Global.asax.cs:
protected void Application_Start()
{
StructureMapBootstrapper.Bootstrap();
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}