gpt4 book ai didi

c# - 依赖注入(inject) - 当前上下文中不存在名称 'Bind' - MethodAccessException 未处理

转载 作者:行者123 更新时间:2023-11-30 14:02:19 27 4
gpt4 key购买 nike

代码示例:

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。

我不确定如何解决“名称‘Bind’在当前上下文中不存在”错误。我经历了这个问题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);
}
}
}

上述代码在 var samurai = kernel.Get(); 行导致“MethodAccessException was unhandled”;我在谷歌上搜索,但没有找到任何具体的解决方案

异常

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:

最佳答案

你得到这个错误的原因是因为 Bind 通常是内核上的一个方法,所以你应该在模块之外执行此操作。此外,您应该在解析 Samurai 之前创建绑定(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 有一个 protected Bind 方法,它执行相同的功能:

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

任何一种方法都是合适的,当您的绑定(bind)变得有点复杂时,建议将它们放入模块中。

编辑 确保您所有的类和接口(interface)都是公共(public)的,否则 Ninject 无法执行它们。当未指定可访问性修饰符时,它默认为 internal。这解释了 MethodAccessException

关于c# - 依赖注入(inject) - 当前上下文中不存在名称 'Bind' - MethodAccessException 未处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6161270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com