C# 依赖项注入:没有为此对象定义无参数构造函数
我正在尝试使用依赖项注入(.NET Framework 4.6,ASP.NET MVC),但收到错误: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
没有为此对象定义无参数构造函数。
如果我还为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;
}