StructureMap 2,5 y ejecutores internos
-
20-09-2019 - |
Pregunta
Es posible obtener este material de trabajo (de alguna manera a la fuerza ObjectFactory crear instancias como activador)
en el ejemplo siguiente todo se coloca en un ensamblaje de sigle
public interface IUnitOfWorkFactory
{
IUnitOfWork Create();
}
internal class NHUnitOfWorkFactory : IUnitOfWorkFactory
{
public IUnitOfWork Create()
{
//// do needed stuff
}
}
reinicialización:
ObjectFactory.Configure(x =>
{
x.ForRequesedType<IUnitOfWorkFactory>.TheDefaultIsConcreteType<NHUnitOfWorkFactory>();
});
uso:
IUnitOfWorkFactory factory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();
Mi resultado:
Porktal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work : StructureMap.StructureMapException : StructureMap Exception Code: 207 Internal exception while creating Instance 'Porktal.Core.Data.NH.NHUnitOfWorkFactory, Porktal.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' of PluginType Porktal.Core.Data.IUnitOfWorkFactory. Check the inner exception for more details. ---- System.MethodAccessException : Porktal.Core.Data.NH.NHUnitOfWorkFactory..ctor() Stack Trace: at StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) at StructureMap.Pipeline.ConfiguredInstanceBase`1.build(Type pluginType, BuildSession session) at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session) at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session) at StructureMap.Pipeline.BuildPolicy.Build(BuildSession buildSession, Type pluginType, Instance instance) at StructureMap.InstanceFactory.Build(BuildSession session, Instance instance) at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance) at StructureMap.BuildSession.b__0(Type t) at StructureMap.Util.Cache`2.get_Item(KEY key) at StructureMap.BuildSession.CreateInstance(Type pluginType) at StructureMap.Container.GetInstance(Type pluginType) at StructureMap.Container.GetInstance[T]() at StructureMap.ObjectFactory.GetInstance[PLUGINTYPE]() at Porktal.Core.Bootstraper.Bootstrap() in D:\Porktal\Porktal.Core\Bootstraper.cs:line 20 at Porktal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work() in D:\Porktal\Porktal.Core.Tests\UnitOfWorkTests.cs:line 11 ----- Inner Stack Trace ----- at PorktalCoreDataNHNHUnitOfWorkFactoryInstanceBuilder44203c8113d44053be045df4db28c3dc.BuildInstance(IConfiguredInstance , BuildSession ) at StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder)
Solución
Tienes 2 opciones. Puede hacer NHUnitOfWorkFactory pública (preferido).
O usted puede poner el código que construye su clase interna en su ensamblaje (donde tiene acceso a los miembros internos) en forma de un lambda, y pasarlo a StructureMap:
ObjectFactory.Configure(x => {
x.ForRequestedType<IUnitOfWorkFactory>()
.TheDefault.Is.ConstructedBy(() => new NHUnitOfWorkFactory())
});
El equivalente con las nuevas versiones de StructureMap es:
ObjectFactory.Configure(x => {
x.For<IUnitOfWorkFactory>().Use(() => new NHUnitOfWorkFactory())
});
Otros consejos
No he verificado esto, pero haciendo la parte interna de la asamblea de NHUnitOfWorkFactory visible para el montaje StructureMap puede hacer el truco.
Puede usar el atributo InternalsVisibleTo en su clase AssemblyInfo.