ฉันสามารถใช้สิ่งอำนวยความสะดวกในการบันทึกปราสาทในระหว่างขั้นตอนการลงทะเบียนได้หรือไม่?

ฉันใช้ระบบตัดไม้ของ Castle Windsor และใช้งานได้ดีมาก ฉันมีโปรแกรมติดตั้งที่ลงทะเบียน interceptor พร้อมสิ่งอำนวยความสะดวกในการเชื่อมต่อกับเหตุการณ์ต่างๆ เพื่อที่ฉันจะได้เก็บโค้ดส่วนใหญ่ของฉันไว้โดยไม่รู้ตัวทั้ง Castle และ log4net อย่างมีความสุข

การลงทะเบียนของฉันส่วนใหญ่เกิดขึ้นในโค้ด แต่สำหรับการบันทึก ฉันกำลังเชื่อมต่อมันใน web.config (ซึ่งจะติดตั้งก่อน) เช่นนี้

<castle>        
    <facilities>
         <facility id="logging"
              type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle>

เหตุผลก็คือฉันไม่จำเป็นต้องรวมส่วนการกำหนดค่านี้เมื่อไปที่การใช้งานจริง นอกจากนี้ยังหมายความว่าฉันสามารถสลับจาก log4net เป็น nlog เป็นสิ่งอื่นที่เราต้องการได้ทันที และหมายความว่าไม่มีส่วนประกอบใดของฉันต้องอ้างอิง log4net โดยตรง

ปัญหาที่ฉันมีคือฉันต้องการใช้การบันทึกในระหว่างขั้นตอนการลงทะเบียน ฉันทำเช่นนี้เพราะการลงทะเบียนมีความซับซ้อนเล็กน้อย และฉันต้องการติดตามสิ่งที่เกิดขึ้นและใช้เวลานานเท่าใดได้อย่างง่ายดาย (ส่วนใหญ่เป็นเพราะฉันมีระบบประเภทปลั๊กอิน)

ใน LoggerInstaller ของฉัน ฉันกำลังพยายามแก้ไข ILoggerFactory เพื่อให้ฉันสามารถสร้างคนตัดไม้และเชื่อมโยงเหตุการณ์บางอย่างเข้ากับวัตถุยูทิลิตี้ของฉันได้ แต่สิ่งนี้ล้มเหลวด้วยสิ่งนี้:

ComponentNotFoundException: No component for supporting the service Castle.Core.Logging.ILoggerFactory was found

จากการขุดค้นรอบๆ แหล่งที่มาของ Castle ฉัน คิด ว่าตัวติดตั้งทั้งหมดได้รับการติดตั้งก่อนสิ่งอำนวยความสะดวกใด ๆ ดังนั้นจึงปรากฏว่าสิ่งอำนวยความสะดวกนั้นไม่ได้รับการเตรียมใช้งานภายในตัวติดตั้งของฉัน ถ้าฉันสร้างตัวติดตั้งตัวที่ 2 เพียงเพื่อเชื่อมต่อเหตุการณ์เพื่อไม่ให้เกิดขึ้นผ่านการกำหนดค่า XML มันก็ใช้งานได้ แต่ฉันต้องการให้บันทึกทุกอย่างเกี่ยวข้องกัน - และมันไม่สมเหตุสมผลเลยที่จะเชื่อมต่อเหตุการณ์หากการบันทึกไม่ได้ ไม่สามารถใช้ได้ (และฉันต้องรู้ก่อนว่าเปิดใช้งานการบันทึกหรือไม่..??)

ตามหลักการแล้ว ฉันต้องการลงทะเบียนสิ่งอำนวยความสะดวก Castle Logging จากผู้ติดตั้งของฉัน แต่ฉันไม่รู้วิธีสรุปองค์ประกอบที่กำหนดค่าได้ (หรือว่าฉันอยากทำ)

มีวิธีที่ง่ายกว่านี้ไหม? ฉันสงสัยว่าฉันไม่ได้ทำสิ่งที่ปกติแล้วเป็นความคิดที่ดี เพราะฉันรู้ว่าฉันไม่ควรแก้ไขปัญหาในขั้นตอนการลงทะเบียน แต่ฉันคิดว่าการติดตั้งนั้นซับซ้อนพอที่จะรับประกันการบันทึกเล็กน้อย

มีใครเคยทำเรื่องแบบนี้มาก่อนบ้างไหม? ความช่วยเหลือใดๆ (หรือการนำทางไปสู่เส้นทางที่ชอบธรรมกว่านี้!) จะได้รับการชื่นชมอย่างมาก


person John    schedule 17.05.2013    source แหล่งที่มา


คำตอบ (1)


หากปัญหาคือการลงทะเบียนโรงงานตัวบันทึกจะเกิดขึ้นหลังจากที่ตัวติดตั้งเสร็จสิ้นแล้วเท่านั้น คุณสามารถลองทำสิ่งต่อไปนี้:

สร้างส่วนกำหนดค่า 2 ส่วน castle1 castle2

<castle1>        
    <facilities>
        <facility id="logging"
            type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
</castle1>

<castle2>        
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle2>

และเริ่มต้นคอนเทนเนอร์ใน 2 ขั้นตอน:

container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle1"))));
container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle2"))));

ที่ด้านบนของไฟล์กำหนดค่าคุณต้องระบุส่วน castle1 และ castle2

ฉันไม่ได้ลอง แต่ฉันคิดว่ามันคุ้มค่าที่จะลอง

ขอแสดงความนับถือ Marwijn

person Marwijn    schedule 17.05.2013
comment
ขอบคุณ! ฉันได้ลองเมื่อเช้านี้และมันก็ทำงานได้อย่างสมบูรณ์แบบ! - person John; 20.05.2013