0
工作,我有幾個不同的項目與解決方案:Autofac工作在ConsoleApplcation而不是從網站
- Project.ConsoleApplication
- Project.Common
- 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();
}
}
}
這些都是在BOTH利弊正在加載的模塊ole應用程序和網站。
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();
}
}
所以那裏的人有什麼想法?
您已經提供了ConsoleApp的Autofac註冊碼,您能否提供WebApp的代碼?您正在WebApp的組合根目錄中註冊Autofac? –
您的MVC控制器看起來像包含'GetAll'方法嗎? – Steven
這是一個連接字符串問題,愚蠢的我。 –