Я пытаюсь использовать StructureMap для регистрации некоторых типов, реализующих общий интерфейс и создаваемых через фабрику.Больше контроля над созданием типичных типов?
Мой код:
public interface IManagerBase<T, TKey> : IDisposable
{
// Get Methods
T GetById(TKey Id);
}
public partial interface IServerHostManager : IManagerBase<ServerHost, int>
{
// ServerHost Specific Get Methods
}
partial class ServerHostManager : ManagerBase<ServerHost, int>, IServerHostManager
{
// Implementation
}
public class ManagerFactory : IManagerFactory
{
public IServerHostManager GetServerHostManager()
{
return new ServerHostManager();
}
}
Это прекрасно работает:
For<IServerHostManager>().HybridHttpOrThreadLocalScoped()
.Use(new ManagerFactory().GetServerHostManager());
Моя фабрика называется и новый экземпляр IServerHostManager возвращается.
Можно ли каким-либо образом сканировать для всех типов общего типа и создать их через мою фабрику?
Это не работает из-за ServerHostManager быть внутренний класс:
Scan(x =>
{
x.AssemblyContainingType(typeof(IManagerBase<,>));
x.AddAllTypesOf(typeof(IManagerBase<,>));
x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>))
.OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped());
});
Что скан команда может использовать, чтобы сказать SM называть мою фабрику?
Спасибо,
Рик
Followup добавил на 5/4:
Извините за задержку в последующей деятельности.
У меня есть куча объектов-менеджеров (> 75), которые создал шаблон nHibernate CodeSmith. Обычно они доступны через заводский объект. Вместо этого, я бы хотел отсканировать их, чтобы они все регистрировались автоматически.
Это, как я теперь зарегистрировать объекты:
For<IActivityLogManager>().HybridHttpOrThreadLocalScoped()
.Use(new ManagerFactory().GetActivityLogManager());
For<IAspnetUserManager>().HybridHttpOrThreadLocalScoped()
.Use(new ManagerFactory().GetAspnetUserManager());
Вот объекты
public interface IManagerBase<T, TKey> : IDisposable
{
// Get Methods
T GetById(TKey Id);
}
public partial interface IActivityLogManager : IManagerBase<BusinessObjects.ActivityLog, int>
{
// Get Methods
IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType);
}
public partial class ActivityLogManager : ManagerBase<BusinessObjects.ActivityLog, int>, IActivityLogManager
{
public IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType)
{
// Code to fetch objects
}
}
public partial interface IAspnetUserManager : IManagerBase<BusinessObjects.AspnetUser, System.Guid>
{
// Get Methods
IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType);
}
public partial class AspnetUserManager : ManagerBase<BusinessObjects.AspnetUser, System.Guid>, IAspnetUserManager
{
public IList<AspnetUser> GetAll()
{
// Code to fetch objects
}
}
Мой Скан код:
Scan(x =>
{
x.AssemblyContainingType(typeof(IManagerBase<,>));
x.AddAllTypesOf(typeof(IManagerBase<,>));
x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>))
.OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped());
});
код сканирования выше не находит объектов в сборке.
Надеюсь, это прояснит мой сценарий.
Спасибо,
Рик
Это не ясно, что другие типы вы хотите инстанцирован , Кажется, вы дали только один пример. Можете ли вы включить пример того, как вы будете регистрировать несколько генериков вручную, а затем, возможно, мы сможем помочь вам построить сканер конвенций, чтобы сделать это автоматически. –
Я добавил к вышеуказанному сообщению. Спасибо. – rboarman
Кто-нибудь ??? Сталкиваясь. – rboarman