温莎城堡到Autofac

时间:2012-12-10 16:20:38

标签: c# dependency-injection castle-windsor autofac

我有一个DevExpress示例mvc网站应用程序。它使用Castle Windsor作为IOC。我只是试图通过Autofac取代但没有运气!

这是示例代码:

container
    .Register(Component
        .For<DbRepositories.ClinicalStudyContext>()
        .LifestylePerWebRequest()
        .DependsOn(new { connectionString }))
    .Register(Component
        .For<DbRepositories.IClinicalStudyContextFactory>()
        .AsFactory())
    .Register(Component
        .For<FirstStartInitializer>()
        .LifestyleTransient())
    .Register(Component
        .For<IUserRepository>()
        .ImplementedBy<DbRepositories.UserRepository>())

这是我的Autofac转换:

var builder = new ContainerBuilder();

builder.RegisterControllers(typeof(MvcApplication).Assembly);

builder.Register(c => 
    new DbRepositories.AdminContext(connectionString))
    .InstancePerHttpRequest();

builder.RegisterType<DbRepositories.IAdminContextFactory>()
    .As<DbRepositories.IAdminContextFactory>();

builder.RegisterType<DbRepositories.UserRepository>()
    .As<IUserRepository>().InstancePerHttpRequest();

关于我的研究,Autofac上没有AsFactory()的实现。

这是IAdminContextFactory界面:

public interface IAdminContextFactory
{
    AdminContext Retrieve();
}

这是错误的应用程序说:

  

类型上没有构造函数   可以找到'Admin.Infrastructure.EFRepository.IAdminContextFactory'   使用'公共绑定标志'。

任何人都可以帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:3)

您的IAdminContextFactory注册将失败,因为RegisterType的第一部分必须是服务类型。在这种情况下,实现 IAdminContextFactory接口的类。 Autofac尝试构建该类型的实例,这肯定会失败,因为您无法实例化接口。

因此,您需要的是IAdminContextFactory接口的实现。 Castle AsFactory方法为您生成此实现。您可以使用the Autofac AggregateService extra。

来获取此行为

有了这些位,你可以这样做:

builder.RegisterAggregateService<IAdminContextFactory>();