В случае, если это помогает другим, я последовал совету Джошуа и добавил свое собственное соглашение о регистрации:
public class PluginConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry) {
if (type.BaseType == null) return;
if (type.BaseType.Equals(typeof(PSAdmin.Core.Domain.PluginBase))) {
if (typeof(IStartUpTask).IsAssignableFrom(type)) {
registry.For<IStartUpTask>()
.TheDefault.Is.OfConcreteType(type);
}
}
}
}
Я не смог заставить работать метод .Add, независимо от того, что я пытался, поэтому пришлосьиспользуйте TheDefault.Is.OfConcreteType (type).
Затем в моем загрузчике я сканирую примерно так:
Scan(x => {
x.AssembliesFromPath(HttpContext.Current.Server.MapPath("~/Plugins"),
assembly => assembly.GetName().Name.Contains("Extension"));
x.Convention<PluginConvention>();
});
Затем я могу получить свои типы задач IStartUp, например, так:
var plugins = ObjectFactory.GetAllInstances<IStartUpTask>();
foreach (var plugin in plugins)
{
plugin.Configure();
}
Тем не менее, после ознакомления с некоторыми новыми функциями StructureMap я не уверен, что мне нужно делать что-либо из перечисленного выше.Например, я мог бы просто изменить свою делегатскую функцию Scan на:
Scan(x => {
x.AssembliesFromPath(HttpContext.Current.Server.MapPath("~/Plugins"),
assembly => assembly.GetName().Name.Contains("Extension"));
x.AddAllTypesOf<PluginBase>();
});
И использовать конкретные типы моего интерфейса (которые наследуются от PluginBase):
var tasks = ObjectFactory.Model.GetAllPossible<IStartUpTask>();
foreach (var task in tasks)
{
task.Configure();
}
Кажется, что оба метода достигаютто же самое.