3

これを機能させることは可能ですか(ObjectfactoryにActivatorのようなインスタンスを強制的に作成させる方法)

以下の例では、すべてが単一のアセンブリに配置されています

public interface IUnitOfWorkFactory
{
    IUnitOfWork Create();
}

internal class NHUnitOfWorkFactory : IUnitOfWorkFactory
{
    public IUnitOfWork Create()
    {
        ////  do needed stuff
    }
}

ブートストラップ:

ObjectFactory.Configure(x =>
{
    x.ForRequesedType<IUnitOfWorkFactory>.TheDefaultIsConcreteType<NHUnitOfWorkFactory>();
}); 

利用方法:

IUnitOfWorkFactory factory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();

私の結果:

Portal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work : StructureMap.StructureMapException : StructureMap 例外コード: 207
PluginType Porktal.Core.Data.IUnitOfWorkFactory のインスタンス 'Portal.Core.Data.NH.NHUnitOfWorkFactory, Porktal.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' の作成中に内部例外が発生しました。詳細については、内部例外を確認してください。
---- System.MethodAccessException : Portal.Core.Data.NH.NHUnitOfWorkFactory..ctor()
スタックトレース:
   StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build (タイプ pluginType、BuildSession セッション、InstanceBuilder ビルダー) で
   StructureMap.Pipeline.ConfiguredInstanceBase`1.build (タイプ pluginType、BuildSession セッション) で
   StructureMap.Pipeline.Instance.createRawObject (タイプ pluginType、BuildSession セッション) で
   StructureMap.Pipeline.Instance.Build (タイプ pluginType、BuildSession セッション) で
   StructureMap.Pipeline.BuildPolicy.Build (BuildSession buildSession、タイプ pluginType、インスタンス インスタンス) で
   StructureMap.InstanceFactory.Build (BuildSession セッション、インスタンス インスタンス) で
   StructureMap.BuildSession.CreateInstance (タイプ pluginType、インスタンス インスタンス) で
   StructureMap.BuildSession.b__0(タイプ t) で
   StructureMap.Util.Cache`2.get_Item(KEY キー) で
   StructureMap.BuildSession.CreateInstance (タイプ pluginType) で
   StructureMap.Container.GetInstance (タイプ pluginType) で
   StructureMap.Container.GetInstance[T]() で
   StructureMap.ObjectFactory.GetInstance[PLUGINTYPE]() で
   D:\Portal\Portal.Core\Bootstraper.cs:line 20 の Porktal.Core.Bootstraper.Bootstrap() で
   D:\Portal\Portal.Core.Tests\UnitOfWorkTests.cs:line 11 の Porktal.Core.Tests.UnitOfWorkTests.Can_Start_Unit_of_Work() で
----- 内部スタック トレース -----
   PorktalCoreDataNHNHUnitOfWorkFactoryInstanceBuilder44203c8113d44053be045df4db28c3dc.BuildInstance (IConfiguredInstance、BuildSession) で
   StructureMap.Pipeline.ConfiguredInstanceBase`1.StructureMap.Pipeline.IConfiguredInstance.Build (タイプ pluginType、BuildSession セッション、InstanceBuilder ビルダー) で

4

2 に答える 2

9

2つのオプションがあります。NHUnitOfWorkFactoryをパブリックにすることができます(推奨)。

または、内部クラスを構築するコードをラムダの形式でアセンブリ(内部メンバーにアクセスできる場所)に配置し、StructureMapに渡すことができます。

ObjectFactory.Configure(x => {
  x.ForRequestedType<IUnitOfWorkFactory>()
   .TheDefault.Is.ConstructedBy(() => new NHUnitOfWorkFactory())
});

新しいバージョンのStructureMapと同等のものは次のとおりです。

ObjectFactory.Configure(x => {
  x.For<IUnitOfWorkFactory>().Use(() => new NHUnitOfWorkFactory())
});
于 2009-10-09T15:04:02.413 に答える
0

これは確認していませんが、NHUnitOfWorkFactoryのアセンブリの内部をStructureMapアセンブリから見えるようにすることでうまくいく可能性があります。

AssemblyInfoクラスでInternalsVisibleTo属性を使用します。

于 2009-10-13T19:24:07.053 に答える