0

クラスのインスタンスを返すサードパーティのライブラリがあります。Unityそれは私の管理外ですが、そのパブリック プロパティに注入するために使用したいと考えています。クラスは部分的でも継承的でもないため、そのプロパティに追加できないため、 XML構成をDependecyAttribute使用して指定を行うことができるかどうか疑問に思っています。Unity

Unity'sXML 構成を使用してビルドアップ依存関係を構成することは可能ですか? 答えが「はい」の場合。それを行うために XML を構成する方法は?

私はもう試した:

<register type="IService" mapTo="Service"> <!--Service has public constructor-->
</register>

<!--ThirdPartyObj has no interface and no public constructor-->
<register type="ThirdPartyObj " mapTo="ThirdPartyObj">
    <!-- Inject the property "Service" -->
    <property name="Service" /> //type of the property is IService
</register>

この構成は、Unity Resolve ThidPartyObj購入が機能しない場合BuilUp(Service プロパティの Null 参照) に機能しResolve ThirdPartyObj、パブリック コンストラクターがないために機能しません。

アーカイブしたいものの簡単な例:

IUnityContainer uc = New UnityContainer() //create container
container.LoadConfiguration() // load from XML config
ThirdPartyObj foo = ThirdPartyLibrary.getFooInstace() //get third party instance
container.BuildUp(foo.getType, foo) //inyect dependencies
Console.WriteLine(foo.Service.getServiceMessage)
4

2 に答える 2

1

Unity に適したラッパーを作成します。

public interface IThirdpartyWrapper
{
   ThirdpartyObj ConfiguredObject{get;}
}
public class ThirdpartyWrapper:IThirdpartyWrapper
{
    private ThirdpartyObject _thirdPartyObject;
     public ThirdpartyWrapper(IService myService)
    {
         _thirdPartyObject=ThirdPartyLibrary.getFooInstance();
         _thirdPartyObject.Service=myService;
    }
     public ThirdpartyObj ConfiguredObject
    {
      get{return _thirdPartyObject;}
    }

}

これで、Unity に適したクラスで遊ぶことができます

Unity XML 構成:

<register type="IService" mapTo="Service"> <!--Service has public constructor-->
</register>

<!--ThirdPartyObj has no interface and no public constructor-->
<register type="IThirdpartyWrapper" mapTo="IThirdpartyWrapper">
</register>

私が次のことをするとき:

var wrapper=_container.Resolve<IThirdpartyWrapper>();
var configuredObject=wrapper.ConfiguredObject;

ラッパーは、サードパーティ オブジェクトのコピーをインスタンス化し、サービスを適切なプロパティに挿入します (または、メソッド呼び出しなどを介して渡すこともできます)。

これは多くのコードを必要とせず、単体テスト可能で、必要なことを行います。

于 2013-07-31T11:47:51.900 に答える
1

投稿されたコードに基づいて、問題はないはずです。

コンソール アプリケーションと、ThirdPartyLibrary というクラス ライブラリの 2 つのプロジェクトを作成しました。

ThirdPartyLibrary は、次のもので構成されています (投稿されたコードから推測)。

namespace ThirdPartyLibrary
{
    public interface IService
    {
        string GetServiceMessage { get; }
    }

    public class Service : IService
    {
        public Service() { }

        public string GetServiceMessage
        {
            get { return "The message!"; }
        }
    }

    public static class ThirdPartyLibrary
    {
        public static ThirdPartyObj GetFooInstance()
        {
            return new ThirdPartyObj();
        }
    }

    public interface IThirdPartyObj { }
    public class ThirdPartyObj : IThirdPartyObj
    {
        internal ThirdPartyObj() { }
        public IService Service { get; set; }
    }
}

XML 構成は次のようになります。

<?xml version="1.0"?>
<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>
      <register type="ThirdPartyLibrary.IService, ThirdPartyLibrary" mapTo="ThirdPartyLibrary.Service, ThirdPartyLibrary">
      </register>

      <register type="ThirdPartyLibrary.IThirdPartyObj, ThirdPartyLibrary" mapTo="ThirdPartyLibrary.ThirdPartyObj, ThirdPartyLibrary">
        <!-- Inject the property "Service" -->
        <property name="Service" />
      </register>
    </container>

  </unity>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
</configuration>

コンソール アプリケーションは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer(); //create container
        container.LoadConfiguration(); // load from XML config
        ThirdPartyObj foo = ThirdPartyLibrary.ThirdPartyLibrary.GetFooInstance(); //get third party instance
        container.BuildUp(foo.GetType(), foo); //inyect dependencies
        Console.WriteLine(foo.Service.GetServiceMessage);
    }
}

これは正常に機能し、期待どおりに出力The message!されます。おそらく、正確なシナリオは投稿された(架空のものだと思います)例と同じではないか、何か他のものが適切に構成されていませんか?

于 2013-07-31T23:46:20.887 に答える