2009-03-02 20 views
1

ile iBATIS.NET kullanarak iBATIS.NET ile eşlenen bir sınıf O/R'de genel bir özel koleksiyon arabirimi (Microsoft Kalıpları ve Uygulamaları Birimi ile enjeksiyon desteği) kullanmaya çalışıyorum. Bunun mümkün olup olmadığını ve nasıl yapılacağını bilen var mı? Genel özel koleksiyon arabirimleri ve Unity

I CollectionBase uzanan SqlDataItemCollection <T> eşlemek bir IDataItemCollection <T> arayüzü vardır. Sınıflarımda IDataItemCollection <T> kullanmak istiyorum, böylece SqlDataItemCollection <T> arabirimini Unity aracılığıyla arabirimi genişleten diğer sınıflarla birlikte değiştirebilirim. IBATIS.NET haritalama dosyası, beton sınıfını doğrudan diğeri olmadan da olmayacağından referans alabilir.

Aşağıda, kod, veritabanı ve eşlemelerin çok basitleştirilmiş bir örneğini ekledim. Ben tamamen iBATIS.NET için yeni ve sadece şu anda kullanımını kanıtlamak istiyorum, bu yüzden eşleme XML gerektiği gibi yeniden jig lütfen.

Çok teşekkürler,

Paul


C# Kod

SQL Server 2005 veritabanı

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

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 { } 
<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> 
+0

Sorun, somut bir sınıf yerine bir arabirim kullandığım için görünüyor. IDataItemCollection 'un SqlDataItemCollection ile değiştirilmesi, her şeyin beklendiği gibi çalışmasına neden olur, maalesef somut sınıfları Unity ile değiştirme yeteneğine ihtiyacım var. Bu bir iBATIS.NET kısıtlaması mı? – tRi11

cevap

0

Uygulamamın bir kısmını arayüzlere geri yükledikten hemen sonra aynı sorunu yaşadım. Arayüzün koleksiyonumun tanımını açık bir şekilde uygulayarak ve daha sonra uygulamayı somut sınıf olarak kopyalayarak bunu gerçekleştirdim. Bu probleminizi çözmeyebilir.

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; } 
    } 
} 

Bu iBATIS.NET açık arabirim geliştirme beni asıl Concrete veya gerçek GroupCollection atıfta olmadan benim app boyunca IConcrete s kullanmanızı sağlar iken bir tür dönüştürmesi hata içine çalıştırmadan koleksiyona öğeler eklemenizi sağlar.