Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖项注入:没有为此对象定义无参数构造函数_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

C# 依赖项注入:没有为此对象定义无参数构造函数

C# 依赖项注入:没有为此对象定义无参数构造函数,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我正在尝试使用依赖项注入(.NET Framework 4.6,ASP.NET MVC),但收到错误:没有为此对象定义无参数构造函数。如果我还为HomeController提供无参数构造函数,则\u令牌为空 如何通过依赖项注入正确地提供此对象? Owin Startup.cs: public void ConfigureServices(IServiceCollection services) { services.AddTransient<IGenerateToken, Gene

我正在尝试使用依赖项注入(.NET Framework 4.6,ASP.NET MVC),但收到错误:
没有为此对象定义无参数构造函数。
如果我还为
HomeController
提供无参数构造函数,则
\u令牌
为空

如何通过依赖项注入正确地提供此对象? Owin Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IGenerateToken, GenerateTokenService>();
}
public class HomeController : Controller
{
    private readonly ueSecurityToken _token;


    public HomeController(ueSecurityToken token)
    {
        _token = token;
    }    

    public async Task<ActionResult> RunCreditCard()
    {
        var client = new UsaEPayClient();

        var request = new TransactionRequestObject
        {
            CreditCardData = new CreditCardData()
            {
                CardNumber = "4000100011112224",
                CardExpiration = "0919",
                CardCode = "123"
            }
        };
        var response = await client.runSaleAsync(_token, request);
        return View(response);
    }
}
public ueSecurityToken GenerateToken(string key, string pin)
{
    var token = new ueSecurityToken
    {
        SourceKey = key,
        ClientIP = new WebClient().DownloadString("http://bot.whatismyipaddress.com/")
    };

    var hash = new ueHash
    {
        Type = "md5",
        Seed = Guid.NewGuid().ToString()
    };
    var input = string.Concat(token.SourceKey, hash.Seed, pin); // combine data into single string
    // Create a new instance of the MD5CryptoServiceProvider object.
    var md5Hasher = MD5.Create();
    // Convert the input string to a byte array and compute the hash.
    var data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
    // Create a new Stringbuilder to collect the bytes
    // and create a string.
    var sBuilder = new StringBuilder();
    // Loop through each byte of the hashed data 
    // and format each one as a hexadecimal string.
    foreach (var t in data)
    {
        sBuilder.Append(t.ToString("x2"));
    }
    hash.HashValue = sBuilder.ToString();
    token.PinHash = hash;
    return token;
}

public interface IGenerateToken
{
    ueSecurityToken GenerateToken(string key, string pin);
}

当然你可以使用DI。我更喜欢简单的注入器,因为它很简单,而且在大多数情况下,它涵盖了所有场景。有关更多和更高级的信息,您可以使用Autofac或Ninject

但是控制器中的方法没有被DI击中。他们为类设置构造函数。因此,您的DI在这种情况下没有用处。

而不是注释。。。 DI无法解决此问题,因此会出现错误:) GenerateToken做什么?这是一个静态函数/类吗?您可能需要创建一个接口:

public interface IGenerateToken
{ 
    string GenerateToken();
}
还有一节课:

public class GenerateTokenService : IGenerateToken
{
  //your logic
}
然后,您可以在DI中添加用于创建令牌的单例:

services.AddSingleton<IGenerateToken, GenerateTokenService >();
这也使测试变得更好:)


试试看

我不知道你的具体需要是什么。当然,您可以在MVC中使用依赖项注入。对于Ninject依赖项,您可以参考Injection@AdilMammadov该示例使用的是NInject,我指的是Owin启动类中提供的Configuration/ConfigureServices函数。(编辑-道歉、误读和假设使用的是NInject)您注册了依赖项了吗?使用Ninject时,您需要在应用程序启动时调用(Bind().to())。我必须使用第三方注入提供程序吗?在.NET Core DI中,它不在MVC5中吗?我明白了!我需要将它放在控制器的构造函数中,而不是放在其中一个操作上!完全正确!只是出于好奇……为什么您希望在构造函数中使用令牌?好吧,这打破了它:(,更新的问题。这是一个支付处理平台,控制器的每个操作都使用令牌,所以我想生成它并存储一次,然后在需要它的控制器中引用它。对于更高级的情况,您可以使用Structuremap…;-)太好了!谢谢,不幸的是,它仍然抛出了相同的错误:
没有为此对象定义无参数构造函数。
@AdamReed您解决了这个问题吗?得到了相同的问题。
private readonly IGenerateToken _token;

public HomeController(IGenerateToken token)
{
    _token = token;
}