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


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







All Articles