依赖注入:没有为此对象定义无参数构造函数 [英] Dependency Injection: No parameterless constructor defined for this object

查看:71
本文介绍了依赖注入:没有为此对象定义无参数构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用依赖项注入(.NET Framework 4.6,ASP.NET MVC),但出现错误:没有为此对象定义无参构造函数.如果我还提供了无参 HomeController 的构造函数,则 _token 为空.

I am attempting to use dependency injection (.NET Framework 4.6, ASP.NET MVC), but I am getting the error: No parameterless constructor defined for this object. If I also provide a parameterless constructor for HomeController then _token is null.

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);
    }
}

GenerateTokenService:

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.我更喜欢Simple Injector,因为它很简单,并且在大多数情况下,它涵盖了所有情况.要获得更多进步,您可以使用Autofac或Ninject.

Sure you can use DI. I prefer Simple Injector because it is simple and most cases it covers all the scenarios. For more and advancing you can use Autofac or Ninject.

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

But your method in controller it not hit by the DI. They set the constructors for the classes. So your DI has no use in this case.

这篇关于依赖注入:没有为此对象定义无参数构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆