我正在尝试使用依赖项注入(.NET Framework 4.6、ASP.NET MVC),但收到错误:No parameterless constructor defined for this object.
如果我还提供一个无参数构造函数HomeController
then _token
一片空白。
如何通过依赖注入正确提供这个对象?
欧文启动.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。我更喜欢 Simple Injector,因为它很简单,而且大多数情况下它涵盖了所有场景。如需更多信息和高级功能,您可以使用 Autofac 或 Ninject。
但是你在控制器中的方法没有被 DI 击中。他们为类设置构造函数。所以你的 DI 在这种情况下没有用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)