2017-09-06 76 views
-1

我正在使用抽象工廠模式來實例化對象。我只向客戶端分配了一個類(公共類)來實例化一個對象,並且該對象有實例化其他對象(Friend類僅用於該程序集)的方法。Castle Windsor - 如何解決使用抽象工廠模式創建的接口

現在我想實現Castle-Windsor來解析我的接口。我的所有對象創建邏輯到一個接口坐在我的公共類。

如何使用具有相同返回類型接口的方法的對象來解析我的接口。

BE界面 - >

Public Interface IDependency1 
    Property DoSomething As String 
End Interface 
Public Interface IDependency2 
    Property DoSomething2 As String 
End Interface 
Public Interface IDependencyAll 
    Readonly Property Dependency1() As IDependency1 
    Function Dependency2() As IDependency2 
End Interface 

BL Implementaions - >

Friend Class Dependency1 
    Implements IDependency1 

    Private newPropertyValue As String = "Test" 
    Public Property DoSomething() As String Implements IDependency1.DoSomething 
     Get 
      Return newPropertyValue 
     End Get 
     Set(ByVal value As String) 
      newPropertyValue = value 
     End Set 
    End Property 

End Class 



Friend Class Dependency2 
    Inherits rbASE 
    Implements IDependency2 
    Private newPropertyValue As String = "Test" 
    Public Property DoSomething2() As String Implements IDependency2.DoSomething2 
     Get 
      Return newPropertyValue 
     End Get 
     Set(ByVal value As String) 
      newPropertyValue = value 
     End Set 
    End Property 

End Class 



Public Class Main 
    Implements IDependencyAll 
    Public Readonly Property Dependency1() As IDependency1 Implements IDependencyAll.Dependency1 
     Get 
      Return New Dependency1 
     End Get 
    End Property 

    Public Function Dependency2() As IDependency2 Implements IDependencyAll.Dependency2 
     Return New Dependency2() 
    End Function 

End Class 

客戶端 - >

Dim container = New WindsorContainer() 
     'container.Register(Castle.MicroKernel.Registration.Component.For(Of BE.Main1)()) 
     'container.Register(Castle.MicroKernel.Registration.Component.For(Of BE.IDependency1)().ImplementedBy(Of BE.Dependency12)()) 
     'container.Register(Castle.MicroKernel.Registration.Component.For(Of BE.IDependency2)().ImplementedBy(Of BE.Dependency22)()) 
     'Dim mainThing = container.Resolve(Of BE.Main1)() 
     'mainThing.DoSomething() 
     Dim container1 = New WindsorContainer() 
     ' container1.Register(Classes.FromAssemblyNamed("BE").Pick.WithService.DefaultInterfaces.LifestyleTransient) 
     container1.Register(Classes.FromAssemblyNamed("BL").BasedOn(GetType(IDependencyAll)).WithService.Base.LifestyleTransient) 
     'container1.Register(Classes.FromAssemblyNamed("BL").BasedOn(GetType(IDependency1)).WithService.Base.LifestyleTransient) 


     ' container1.Register(Castle.MicroKernel.Registration.Component.For(Of BE.IDependencyAll)().ImplementedBy(Of BL.Main)()) 
     Dim answer As String = "not resolved properluy" 
     Dim IcaseController As IDependencyAll = container1.Resolve(GetType(IDependencyAll)) 
     Dim p = IcaseController.CreateBI(Of IDependency1)() 
     answer = p.DoSomething 
     'Dim p = IcaseController. 
     Label1.Text = answer 

它有2個類庫項目和1個UI項目。

回答

0

在對此進行了一些調查後,我發現通過實現XML配置我可以解決我的依賴關係。

通過這種方式,我仍然可以將班級保留爲班級圖書館的「內部或朋友」。我只允許封裝的類在我的客戶端外部可見。

有了這個,我不必更改我的類的訪問修飾符。我發現其他一些方法也沒有XML配置,但這些更改需要我的類修飾符更改爲「公共」。但我不想將這些類暴露給客戶端。

進行代碼

Public Interface IDependency1 Property DoSomething As String End Interface Public Interface IDependency2 Readonly Property DoSomething2 As String End Interface BL代碼

Friend Class Dependency1 
     Implements IDependency1 

     Private newPropertyValue As String = "Test" 
     Public Property DoSomething() As String Implements IDependency1.DoSomething 
      Get 
       Return newPropertyValue 
      End Get 
      Set(ByVal value As String) 
       newPropertyValue = value 
      End Set 
     End Property 

    End Class 
    Imports BE 

    Friend Class Dependency2 
     Implements IDependency2 
     Private cc As String 
     Public Sub New(cons As String) 
      cc = cons 
     End Sub 
     Public readonly Property DoSomething2 As String Implements IDependency2.DoSomething2 
      Get 
       Return cc + "test" 
      End Get 
     End Property 

    End Class 
    Imports BE 
    Imports System.Reflection 
    Imports Castle.MicroKernel.Registration 
    Imports Castle.MicroKernel.Resolvers.SpecializedResolvers 
    Imports Castle.Windsor 
    Public Class MainRepo 
     Inherits rbASE 
     Implements IDependencyAll 
     Function Generate(Of T)(cons As String) As T Implements IDependencyAll.ResolveBL 
      Dim container = New WindsorContainer() 
      container.Kernel.Resolver.AddSubResolver(New ArrayResolver(container.Kernel)) 


    container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig()) 
     Return container.Resolve(Of T)(New With {.cons = cons}) 
    End Function 
end class 

這裏是UI代碼

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 


    Dim container1 = New WindsorContainer() 
    ' container1.Register(Classes.FromAssemblyNamed("BE").Pick.WithService.DefaultInterfaces.LifestyleTransient) 
    container1.Register(Classes.FromAssemblyNamed("BL").BasedOn(GetType(IDependencyAll)).WithService.Base.LifestyleTransient) 
    'container1.Register(Classes.FromAssemblyNamed("BL").BasedOn(GetType(IDependency1)).WithService.Base.LifestyleTransient) 

    ' container1.Kernel.Resolver.AddSubResolver(New CustomArrayResolver(container1.Kernel, GetType(IDependencyAll()))) 

    ' container1.Register(Castle.MicroKernel.Registration.Component.For(Of BE.IDependencyAll)().ImplementedBy(Of BL.Main)()) 

    Dim answer As String = "not resolved properluy" 
    Dim IcaseController As IDependencyAll = container1.Resolve(Of IDependencyAll)() 
    Dim p = IcaseController.ResolveBL(Of IDependency2)("test cons") 

    answer = p.DoSomething2 
    'Dim p = IcaseController. 
    Label1.Text = answer 

    ' mainThing1.DoSomething() 
End Sub 

這裏是配置

<configuration> 
    <configSections> 
    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" /> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 


    <castle> 
     <components> 
     <component id="Dependency1" service="BE.IDependency1, BE" type="BE.IDependency1, BE" /> 
     <component id="Dependency2" service="BE.IDependency2, BE" type="BL.Dependency2, BL" /> 
     </components> 
    </castle> 
0

我有一些問題閱讀VB代碼,但如果我理解正確的方式,你的意思是這

public interfaces 
IDependency1 
IDependency2 
IDependencyAll (provides access to IDependency1 and IDependency2) 


internal componenets 
Dependency1 implementing IDependency1 
Dependency2 implementing IDependency2 

public components 
Main implementing IDependencyAll 

所以,你將有兩個選擇

  1. 允許財產注射。然後溫莎在解析Main時注入相關性。 (需要財產上的公共設置者)
  2. 爲Main創建一個構造函數,並將IDependency1和IDependency2作爲參數。然後Windsor會在實例創建Main時傳遞依賴項(您必須從您的構造函數中分配屬性)

如果它有幫助,我可以爲您提供C#代碼。

+0

我將與Prope嘗試與溫莎城堡共同噴射。 – Ramesh