【发布时间】:2018-12-25 16:01:39
【问题描述】:
我使用 Autofac 的依赖注入开发 aspnet webapi 应用程序,但遇到了一个问题。
我创建了模型Order、它的存储库和工作单元。
public class Order
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string UserId { get; set; }
public int ServiceId { get; set; }
public string Header { get; set; }
public string Description { get; set; }
public string City { get; set; }
public string Address { get; set; }
public int Price { get; set; }
public string Name { get; set; }
public string PhoneNumber { get; set; }
public DateTime CompletedOn { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
OrderRepository.cs
public class OrderRepository : IRepository<Order>
{
private ApplicationContext database;
public OrderRepository(ApplicationContext database)
{
this.database = database;
}
public void Create(Order item)
{
database.Orders.Add(item);
}
public void Delete(int id)
{
var order = database.Orders.Find(id);
if (order != null)
{
database.Orders.Remove(order);
}
}
public Order Get(int id)
{
return database.Orders.Find(id);
}
public IEnumerable<Order> GetList()
{
return database.Orders;
}
public void Update(Order item)
{
database.Entry(item).State = EntityState.Modified;
}
}
UnitOfWork.cs
public class UnitOfWork : IUnitOfWork
{
private ApplicationContext database;
private OrderRepository orderRepository;
private bool disposed = false;
public IRepository<Order> Orders
{
get
{
if (orderRepository == null)
{
orderRepository = new OrderRepository(database);
}
return orderRepository;
}
}
public UnitOfWork(ApplicationContext database)
{
this.database = database;
}
public async Task SaveAsync()
{
await database.SaveChangesAsync();
}
public virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
database.Dispose();
}
this.disposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
然后我做了 OrderManager
public class OrderManager : IOrderManager
{
IUnitOfWork database;
public OrderManager(IUnitOfWork database)
{
this.database = database;
}
public void CreateOrder(OrderViewModel order)
{
database.Orders.Create(new Order
{
UserId = order.UserId,
Header = order.Header,
Description = order.Description,
City = order.City,
Address = order.Address,
Price = order.Price,
Name = order.Name,
PhoneNumber = order.PhoneNumber,
CompletedOn = order.CompletedOn,
CreatedAt = order.CreatedAt,
UpdatedAt = order.UpdatedAt
});
}
public Order GetOrder(int id)
{
return database.Orders.Get(id);
}
public IEnumerable<Order> GetOrders()
{
return database.Orders.GetList();
}
}
然后我尝试制作 inject 并且我认为这里的某个地方出错了,因为我写了这个。
public static void ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(User).Assembly);
builder.RegisterType<ApplicationContext>().AsSelf().InstancePerRequest().WithParameter("connectionString", "DefaultConnection");
builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest();
builder.Register(c => new UnitOfWork(c.Resolve<ApplicationContext>())).AsImplementedInterfaces().InstancePerRequest();
builder.RegisterType<OrderManager>().AsSelf().InstancePerRequest();
//builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().WithParameter("database", new ApplicationContext("DefaultConnection")); ;
builder.RegisterType<UserStore<User>>().As<IUserStore<User>>().InstancePerLifetimeScope();
builder.Register(c => new UserStore<User>(c.Resolve<ApplicationContext>())).AsImplementedInterfaces().InstancePerRequest();
builder.RegisterType<RoleStore<IdentityRole>>().As<IRoleStore<IdentityRole, string>>().InstancePerLifetimeScope();
//builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).As<IAuthenticationManager>();
builder.Register(c => new IdentityFactoryOptions<ApplicationUserManager>
{
DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ASP.NET Identity")
});
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
以及弹出错误的地方
protected OrderManager orderManager;
public ValuesController()
{ }
public ValuesController(OrderManager orderManager)
{
this.orderManager = orderManager;
}
public OrderManager OrderManager
{
get
{
return orderManager;
}
set
{
orderManager = value;
}
}
public OrderViewModel Get(int id)
{
var order = OrderManager.GetOrder(id);
var orderViewModel = new OrderViewModel
{
Header = order.Header,
Description = order.Description,
};
return orderViewModel;
}
当我收到订单时,网站会因为 OrderManager 为空而下降。我想我的 DI 实现有问题,但我仍然不知道如何解决它。
【问题讨论】:
-
异常信息是什么?可以分享你的问题
-
@Vinit 在问题的结尾。
-
你有两个构造函数,你能调试一下看看 ValuesController 调用了哪个构造函数。
标签: c# asp.net-mvc asp.net-web-api dependency-injection asp.net-identity