2011-05-28 15 views
2

代碼示例:依賴注入 - 這個名字「綁定」不在當前情況下存在 - MethodAccessException了未處理

namespace DependencyInjection 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     IKernel kernel = new StandardKernel(); 
     var samurai = kernel.Get<Samurai>(); 
     Bind<IWeapon>().To<Sword>(); 
    }  
} 



class Samurai 
{ 
    readonly IWeapon _weapon; 
    public Samurai(IWeapon weapon) 
    { 
     _weapon = weapon; 
    } 
    public void Attack(string target) 
    { 
     _weapon.Hit(target); 
    } 
} 

interface IWeapon 
{ 
    void Hit(string target); 
} 

class Sword : IWeapon 
{ 
    public void Hit(string target) 
    { 
     Console.WriteLine("Sword - ", target); 
    } 
} 

class Arrow : IWeapon 
{ 
    public void Hit(string target) 
    { 
     Console.WriteLine("Arrow - ", target); 
    } 
} 
} 

這是使用ninject實現DI我第一次嘗試。

我不確定如何解決錯誤「名稱'綁定'在當前上下文中不存在」。我經歷了這個問題Compilation Error with Ninject但仍不知道如何解決這個問題。這怎麼能解決。這將是巨大的,如果我能得到的代碼示例,這樣我可以理解更好

編輯:

namespace DependencyInjection 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWeapon>().To<Sword>(); 
     var samurai = kernel.Get<Samurai>(); -----> Exception Line 
     samurai.Attack("Hello"); 
    }  
} 

class Samurai 
{ 
    readonly IWeapon _weapon; 
    public Samurai(IWeapon weapon) 
    { 
     _weapon = weapon; 
    } 
    public void Attack(string target) 
    { 
     _weapon.Hit(target); 
    } 
} 

interface IWeapon 
{ 
    void Hit(string target); 
} 

class Sword : IWeapon 
{ 
    public void Hit(string target) 
    { 
     Console.WriteLine("Sword - ", target); 
    } 
} 

class Arrow : IWeapon 
{ 
    public void Hit(string target) 
    { 
     Console.WriteLine("Arrow - ", target); 
    } 
} 
} 

上面的代碼會導致在線變種武士=內核「MethodAccessException是未處理」。得到();我搜索谷歌,但沒有找到任何具體的解決方案

異常

System.MethodAccessException was unhandled 
    Message="DependencyInjection.Sword..ctor()" 
    Source="Anonymously Hosted DynamicMethods Assembly" 
    StackTrace: 
     at DynamicInjector84db385a6cfb4301b146100b5027c44a(Object[]) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) 
     at Ninject.Activation.Context.Resolve() 
     at Ninject.KernelBase.<Resolve>b__4(IContext context) 
     at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
     at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) 
     at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) 
     at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass1.<Create>b__0(ITarget target) 
     at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
     at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
     at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) 
     at Ninject.Activation.Context.Resolve() 
     at Ninject.KernelBase.<Resolve>b__4(IContext context) 
     at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.<CastIterator>d__aa`1.MoveNext() 
     at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
     at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters) 
     at DependencyInjection.Program.Main(String[] args) in D:\Sandboxes\C_Sharp\DependencyInjection\DependencyInjection\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

你可以解決這個問題[使用Autofac](http://code.google。com/p/autofac /):) – bentayloruk 2011-05-28 11:15:12

+0

@bentayloruk:你真的認爲Ninject是如此的破碎? – 2011-05-29 03:57:19

+0

@ mauricio-scheffer不,我從來沒有用過Ninject。我曾希望笑容能夠表明存在一個笑話。 – bentayloruk 2011-05-29 11:34:28

回答

5

你得到這個錯誤的原因是因爲Bind通常是內核中的一個方法,所以你應該在模塊外部執行此操作。你還應該創建解決武士之前您的綁定,這樣左右交換的最後兩行:

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Bind<IWeapon>().To<Sword>(); 
    kernel.Bind<Samurai>().ToSelf(); 
    var samurai = kernel.Get<Samurai>(); 

}

爲什麼Bind有時候工作沒有核心的原因是因爲你很可能看到的教程做一個模塊內。 NinjectModule有保護Bind方法執行相同的功能:

public class NinjaModule : NinjectModule { 
    public void Load() { 
     Bind<Samurai>().ToSelf() 
     Bind<IWeapon>().To<Sword>(); 
    } 
} 

這兩種方法是適當的,當你的綁定變得有點複雜,它的建議付諸模塊。

編輯確保所有的類和接口都是公共的,否則Ninject不能執行它們。如果未指定輔助功能修飾符,則默認爲internal。這解釋了MethodAccessException

+0

@Igor Zevaka謝謝!但是修改代碼後,會導致MethodAccessException。我已經更新了我的問題,你可以檢查嗎? – 2011-05-30 06:47:23

+0

已更新的答案,您需要綁定Samurai及其所有依賴項才能使此示例正常工作。 – 2011-05-30 08:17:19

+0

我仍然在同一行上得到同樣的錯誤:( – 2011-05-30 08:40:03

1
kernel.Bind<IWeapon>().To<Sword>(); 

或做結合在從NinjectModule繼承的類。

+0

+1用於擴展NinjectModule。爲什麼他不稱它爲'Ninjector' ;-) – corlettk 2011-05-28 11:39:15

1

Bind()方法在IBindingRoot上定義。 StandardKernelNinjectModule都來自實現IBindingRoot的BindingRoot

您可以在內核

public static void Main() 
{ 
    var kernel = new StandardKernel(); 
    kernel.Bind<IWeapon>().To<Sword>(); 
    // Optional, Ninject will try to resolve any non-registered concrete type. 
    kernel.Bind<Samuari>().ToSelf(); 

    var samurai = kernel.Get<Samuari>(); 
} 

,或者通過使用Ninject模塊

public class WeaponModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IWeapon>().To<Sword>(); 
     // Optional, Ninject will try to resolve any non-registered concrete type. 
     Bind<Samuari>().ToSelf(); 
    } 
} 

綁定你的服務,然後加載模塊

public static void Main() 
{ 
    var module = new WeaponModule(); 
    var kernel = new StandardKernel(module); 
    var weapon = kernel.Get<IWeapon>(); 
} 
相關問題