1

この問題の解決策を探すのに迷いました:

私はインターフェースを持っています:

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();

SpecificTestServiceImplExampleMethodFromSpecificメソッド内。

Unity が子クラスでの親プロパティの注入をスキップしているようです。

これはできますか?他の生涯マネージャーをBaseTestServiceImpl登録に設定しようとしましたが、同じように失敗しました。

助けてください。道に迷いました。:(

事前にサンクス。

4

1 に答える 1

0

unity を使用してからしばらく経ちましたが、構成を完全にコードにすることを好みますが、コントローラーで要求された型は、 [Dependency("TestService")]構成されSpecificTestServiceImplていないとして構成されています。Unity は構成されていないと言っていると思っていSpecificTestServiceImplたでしょうが、おそらく具体的なマップされた型を使用しているのでしょう。

パブリック メンバー、インターフェイス、注入された具体的な型のこの組み合わせは、カプセル化されたロジックがかなり不十分であり、適切な設計がもたらす価値のかなりの部分を削除することを付け加える必要があります。テスト コントローラーは、できればインターフェイス ISomeTypeTestService (または同様のもの) を要求する必要があります。これは、BaseTestServiceImpl にマップするか、現在のように要求できる名前付きの ITestService にすることができます。

于 2012-08-01T14:42:04.703 に答える