2012-11-17 6 views
6

के साथ WPF ऐप मैं डब्ल्यूपीएफ में निनजेक्ट के साथ खो गया हूं।निनजेक

मैं इसे App.xaml में शुरू कर रहा हूं लेकिन MainWindow.xaml (इंजेक्टएट्रिब्यूट के साथ भी) में सबसे अच्छी संपत्ति हल नहीं हो रही है और यह शून्य नहीं है।

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 
     base.OnStartup(e); 
    } 
} 

मैंने थोड़ा गुमराह किया और पाया कि यह इस तरह से काम नहीं करता है। एक समाधान खोजने की कोशिश में, मैं कुछ और के साथ IMainWindow बनाने के साथ समाप्त हुआ लेकिन "शून्य दिखाएँ();" और इसे मेनविंडो में जोड़ना।

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 

     kernel.Bind<IMainWindow, MySolution.MainWindow>(); 
     kernel.Get<IMainWindow>().Show(); 

     base.OnStartup(e); 
    } 
} 

इस के लिए, मैं .Get

साथ लाइन पर एक NullReferenceException हो रही है मैं भी इस की कोशिश की:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    {  
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<ITest, Test>(); 

     MainWindow = new MySolution.MainWindow(kernel); 
     //then kernel.Inject(this); in the MainWindow constructor 
     MainWindow.Show(); 

     base.OnStartup(e); 
    } 
} 
अब मैं .Inject लाइन पर एक NullReferenceException हो रही है

मेनविंडो में।

मुझे एक और विभिन्न समाधान मिल गए लेकिन वे हेवीवेट लग रहे थे और मैंने उन सभी का परीक्षण छोड़ दिया और यह कोशिश कर रहा था कि कौन सा काम करता है।

कोई मदद कृपया?

+0

वास्तव में क्या आपके 'NullReferenceException' है? – AgentFire

उत्तर

5

आप अपने प्रकार सही तरीके से पंजीकरण नहीं कर रहे हैं, यही कारण है कि दूसरा उदाहरण निष्पादन को फेंकता है। सही सिंटैक्स है: kernel.Bind<SomeInterface>().To<SomeImplementation>()

तो सही उपयोग:

protected override void OnStartup(StartupEventArgs e) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Bind<ITest>().To<Test>(); 

    kernel.Bind<IMainWindow>().To<MainWindow>(); 
    var mainWindow = kernel.Get<IMainWindow>(); 
    mainWindow.Show(); 

    base.OnStartup(e); 
} 

और तुम [Inject] विशेषता के साथ अपनी संपत्ति को चिह्नित करने की जरूरत है:

public partial class MainWindow : Window, IMainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    [Inject] 
    public ITest Test { get; set; } 
} 

public interface IMainWindow 
{ 
    void Show(); 
} 
+0

हू, मैंने सोचा कि बाइंड () बाइंड () के समान है। ()। जाहिर है नहीं। धन्यवाद! – Mirek

+0

'बाइंड ()' के साथ नहीं, आप एक इंटरफेस को दो कार्यान्वयन में बाध्य कर सकते हैं लेकिन आपको अभी भी '। <> 'के साथ कार्यान्वयन प्रदान करने की आवश्यकता है। – nemesv

+0

मुझे पता है कि यह पुराना है लेकिन जब मैं ऐसा करता हूं, तो मुझे दो मुख्य विंडोज दिखाते हैं, जैसा कि एक के विपरीत होता है। कोई विचार? – JMK

0

मुझे यकीन है कि आप एक समाधान मिल गया हूँ, लेकिन यदि आप चाहते हैं तो मेनविंडो पर संपत्ति इंजेक्शन के बजाय आप कन्स्ट्रक्टर इंजेक्शन का उपयोग कर सकते हैं।

यह डमी इंटरफ़ेस IMainWindow बनाने और आपके सभी इंजेक्शन वाले वर्गों के लिए एक अनावश्यक सार्वजनिक संपत्ति बनाने से बचाता है।

MainWindow.cs

public partial class MainWindow : Window, IMainWindow 
{ 
    private readonly ITest test; 

    public MainWindow(ITest test) 
    { 
     this.test = test; 
     InitializeComponent(); 
    } 

} 

App.xaml.cs:

यहाँ समाधान है

protected override void OnStartup(StartupEventArgs e) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Bind<ITest>().To<Test>(); 

    var mainWindow = kernel.Get<MainWindow>(); 
    mainWindow.Show(); 

    base.OnStartup(e); 
} 
संबंधित मुद्दे