StructureMap 2.5 and internal implementations
Is it possible to get this stuff to work (somehow get Objectfactory to instantiate like Activator)
in the example below everything is placed in the sigle node
public interface IUnitOfWorkFactory
{
IUnitOfWork Create();
}
internal class NHUnitOfWorkFactory : IUnitOfWorkFactory
{
public IUnitOfWork Create()
{
//// do needed stuff
}
}
bootstrapping:
ObjectFactory.Configure(x =>
{
x.ForRequesedType<IUnitOfWorkFactory>.TheDefaultIsConcreteType<NHUnitOfWorkFactory>();
});
using:
IUnitOfWorkFactory factory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();
My result:
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)
+2
source to share
2 answers
You have 2 options. You can make NHUnitOfWorkFactory public (preferred).
Or, you can put the code that creates your inner class in your assembly (where it has access to the inner members) in the form of a lambda, and pass it to a StructureMap:
ObjectFactory.Configure(x => {
x.ForRequestedType<IUnitOfWorkFactory>()
.TheDefault.Is.ConstructedBy(() => new NHUnitOfWorkFactory())
});
Equivalent with newer versions of StructureMap:
ObjectFactory.Configure(x => {
x.For<IUnitOfWorkFactory>().Use(() => new NHUnitOfWorkFactory())
});
+7
source to share
I haven't tested this, but making the internals of the NHUnitOfWorkFactory assembly visible to the StructureMap assembly might do the trick.
The AssemblyInfo class uses the InternalsVisibleTo attribute .
0
source to share