この問題の解決策を探すのに迷いました:
私はインターフェースを持っています:
public interface ITestService
{
...
}
次に、そのインターフェイスを実装し、他のサービスをプロパティとして持つ基本クラスがあります。
public class BaseTestServiceImpl<T> : ITestService, IDisposable where T : class
{
protected T GenericProperty;
public IOtherService OtherService;
public void ExampleMethodFromBase()
{
OtherService.DoSomething();
}
public void Dispose()
{
....
}
}
最後に、その基本クラスを継承するいくつかのクラスがあります。それらの1つの例:
public class SpecificTestServiceImpl : BaseTestServiceImpl<SomeType>
{
public void ExampleMethodFromSpecific()
{
OtherService.DoSomethingElse();
}
}
SpecificTestServiceImplからメソッドを呼び出すコントローラーは次のようになります。
public class TestController : Controller
{
[Dependency("TestService")]
public BaseTestServiceImpl<SomeType> TestService { get; set; }
public JsonResult TestAction()
{
TestService.ExampleMethodFromSpecific();
}
}
Unity の構成は次のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<alias alias="transient" type="Microsoft.Practices.Unity.TransientLifetimeManager, Microsoft.Practices.Unity" />
<alias alias="MyType" type="SomeType" />
<register name="otherService" type="IOtherService" mapTo="OtherServiceImpl">
<lifetime type="singleton" />
</register>
<register type="ITestService" mapTo="BaseTestServiceImpl`1[]">
<lifetime type="transient" />
<property name="OtherService" dependencyName="otherService" />
</register>
<register name="TestService" type="BaseTestServiceImpl`1[MyType]" mapTo="SpecificTestServiceImpl">
<lifetime type="singleton" />
</register>
</container>
</unity>
</configuration>
TestControllerからTestActionが呼び出される瞬間まで、すべてが問題なく解決されます。次に、次の行で NullPointerException を取得します。
OtherService.DoSomethingElse();
SpecificTestServiceImplのExampleMethodFromSpecificメソッド内。
Unity が子クラスでの親プロパティの注入をスキップしているようです。
これはできますか?他の生涯マネージャーをBaseTestServiceImpl登録に設定しようとしましたが、同じように失敗しました。
助けてください。道に迷いました。:(
事前にサンクス。