1

iBATIS.NET でマップされたクラス O/R で、汎用カスタム コレクション インターフェイス (Microsoft Patterns and Practices Unity での注入をサポートするため) を使用しようとしています。これが可能かどうか、また可能であればその方法を知っている人はいますか?

CollectionBase を拡張する SqlDataItemCollection<T> にマップする IDataItemCollection<T> インターフェイスがあります。クラスで IDataItemCollection<T> を使用して、Unity を介してインターフェイスを拡張する他のクラスと SqlDataItemCollection<T> を交換できるようにしたいと考えています。iBATIS.NET マッピング ファイルは具象クラスを直接参照できます。

以下に、コード、データベース、およびマッピングの非常に単純化された例を含めました。私は iBATIS.NET にまったく慣れていないので、現時点ではその使用法を証明したいだけなので、必要に応じてマッピング XML を再調整してください。

どうもありがとう、

ポール


C# コード

public interface IDataItem
{
    object Id { get; set; }
}

public class DataItem : IDataItem
{
    public object Id { get; set; }
}

public interface IDataItemCollection<T> : ICollection where T : IDataItem
{
    // Various Getters and Setters
...
}

public class SqlDataItemCollection<T> : CollectionBase, IDataItemCollection<T> where T : DataItem
{
    public SqlDataItemCollection() { }
    public SqlDataItemCollection(T injType) { }

    // Getters and Setters to implement interfaces
...
}

public class Foo : DataItem
{
    public Foo(IDataItemCollection<Bar> bars)
    {
        Bars = bars;
    }

    public IDataItemCollection<Bar> Bars { get; set; }
}

public class Bar : DataItem { }

SQL Server 2005 データベース

CREATE TABLE Foo
(
    Id bigint IDENTITY(1,1)
)

CREATE TABLE Bar
(
    Id bigint IDENTITY(1,1)
)

CREATE TABLE FooBar
(
    FooId bigint,
    BarId bigint
)

iBATIS.NET mapping.xml

<resultMaps>
    <resultMap id="FooResult" class="Foo">
        <result property="Id" column="Id"/>
        <result property="Bars" column="Id" select="SelectBarsInFoo" lazyLoad="false"/>
    </resultMap>

    <resultMap id="BarResult" class="Bar">
        <result property="Id" column="Id"/>
    </resultMap>
</resultMaps>

<statements>
    <select id="SelectFoo" resultMap="FooResult">
        SELECT Id
        FROM Foo
    </select>

    <select id="SelectBarsInFoo" parameterClass="long" resultMap="BarResult" listClass="SqlDataItemCollection`1[Bar]" >
        SELECT Bar.Id
        FROM Bar
        JOIN FooBar ON Bar.Id = FooBar.BarId
        WHERE FooBar.FooId = #value#
    </select>
</statements>
4

1 に答える 1

0

アプリケーションの一部をインターフェイスにリファクタリングした後、同じ問題が発生しました。コレクションのインターフェイスの定義を明示的に実装し、その実装を具象クラスとして複製することで、これを回避しました。これで問題が解決しない場合があります。

public interface IGroup { }
public class Group : IGroup { }
public class IGroupCollection : IList<IGroup> { }
public class GroupCollection : IGroupCollection { }

public interface IConcrete
{
    IGroupCollection Items { get; set; }
}

public class Concrete : IConcrete
{
    public GroupCollection Items { get; set; }
    IGroupCollection IConcrete.Items
    {
        get { return Items; }
        set { Items = value as GroupCollection; }
    }
}

これにより、iBATIS.NET は型変換エラーが発生することなくアイテムをコレクションに追加できますが、明示的なインターフェイスの実装により、actualまたは actualIConcreteを参照せずにアプリ全体で sを使用できます。ConcreteGroupCollection

于 2010-07-01T19:56:11.940 に答える