我有一个VS解决方案,其中包含几个不同的项目:
- 项目控制台应用程序
- 项目.通用
- Project.Website
我已经设法将 Autofac 设置为从控制台应用程序工作,依赖项已正确注入,并且一切都按预期工作。
控制台应用程序具有非常简单的逻辑,它所做的只是向数据库添加新记录,然后显示数据库中的所有记录。
该网站正在尝试做完全相同的事情,但是当我在网站中调用GetAll
方法时,它不会返回任何记录。不会引发任何错误。
所有接口和具体类都位于控制台应用程序和网站都引用的Project.Common
项目中。
我无法弄清楚为什么它在控制台应用程序中工作而不是在网站项目中工作 - 我是否需要为每个项目以不同的方式配置 Autofac?
我的数据层是按照以下方法使用实体框架构建的:
http://techbrij.com/autofac-ioc-container-asp-net-mvc-di
该网站是一个Umbraco CMS网站,拥有自己的数据库(不确定这是否有所作为(
这是我的代码当前的样子:
class Program
{
static void Main(string[] args)
{
var container = ConfigureContainer();
var application = container.Resolve<ApplicationLogic>();
application.Run();
}
private static IContainer ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new ServiceModule());
builder.RegisterModule(new EFModule());
builder.RegisterType<ApplicationLogic>();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
return container;
}
private class ApplicationLogic
{
private readonly ICampaignService campaignService;
public ApplicationLogic(ICampaignService campaignService)
{
this.campaignService = campaignService;
}
public void Run()
{
Console.WriteLine("enter a name to create a new campaign: ");
string campaignName = Console.ReadLine();
Console.WriteLine("Attempting to create new campaign, please wait...");
var newCampaign = new Campaign();
newCampaign.CampaignName = campaignName;
newCampaign.IsActive = true;
campaignService.Create(newCampaign);
Console.WriteLine(string.Format("The Campaign'{0}' has been created successfully.", campaignName));
var currentCampaigns = campaignService.GetAll();
foreach (var campaign in currentCampaigns)
{
Console.WriteLine(string.Format("The Campaign'{0}' Found.", campaign.CampaignName));
Console.WriteLine(System.Environment.NewLine);
}
Console.ReadLine();
}
}
}
这些是同时加载到控制台应用程序和网站中的模块。
public class EFModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterModule(new RepositoryModule());
builder.RegisterType(typeof(RewardsDbContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerLifetimeScope();
//builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerRequest();
}
}
public class RepositoryModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(Assembly.Load("Project.Common"))
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}
public class ServiceModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(Assembly.Load("Project.Common"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}
所以有人有什么想法吗?
这是一个连接字符串问题,愚蠢的我。