2014-02-27 127 views
0

进出口新的依赖注入和香港专业教育学院决定,因为它似乎有最好的“开箱即用”支持MVC5(其他人可能会更好,但我是一个新手,这一点)如何设置Autofac注册

使用autofac

林创建简单的使用场景,并从维基Ive得到了在application_start将下面的代码global.asax

protected void Application_Start() 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterControllers(typeof(MvcApplication).Assembly); 
    builder.RegisterType<ArtistController>().InstancePerHttpRequest(); 
    builder.RegisterType<ArtistService>().As<IArtistService>().SingleInstance(); 
    builder.RegisterType<ArtistRepository>().As<IArtistRepository>().SingleInstance(); 
    builder.RegisterType<BandMemberRepository>().As<IBandMemberRepository>).SingleInstance(); 
    var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 



    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

,在我ArtistController我有这个

私人IArtistService _artistService;

然后我有一些代码检索和更新数据,都非常简单。这工作正常,我开始让我的头在整个概念。

我的问题是,我是否必须手动注册所有具体类Im?我的应用程序最终可能会增长,我会有许多类,所以这将是一个痛苦的管理。我也碰到过这样的

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 

其尽可能林意识到应该为我注册的一切,但它没有工作。难道我做错了什么 ?


好的,感谢您的建议。

的autofac网站显示了使用lambda表达式的例子,所以我加了这个Global.asax中

builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly) 
       .Where(t => t.Name.EndsWith("Repository")) 
       .AsImplementedInterfaces(); 

builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly) 
       .Where(t => t.Name.EndsWith("Service")) 
       .AsImplementedInterfaces(); 

,但没有工作,任何想法,为什么?

回答

0

我做我注册的最多(90%以上),通过该属性标记它们:

[AttributeUsage(AttributeTargets.Class)] 
[JetBrains.Annotations.MeansImplicitUse] 
public class AutoRegisterAttribute : Attribute {} 

然后我用这个模块注册这些类:

public class AutoRegisterModule : Module 
{ 
    private readonly Assembly[] _assembliesToScan; 

    public AutoRegisterModule(params Assembly[] assembliesToScan) 
    { 
     _assembliesToScan = assembliesToScan; 
    } 

    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterAssemblyTypes(_assembliesToScan) 
      .Where(t => t.GetCustomAttribute<AutoRegisterAttribute>(false) != null) 
      .AsSelf() 
      .AsImplementedInterfaces() 
      .InstancePerLifetimeScope(); 
    } 

    public static AutoRegisterModule ForCallingAssembly() 
    { 
     return new AutoRegisterModule(Assembly.GetCallingAssembly()); 
    } 
} 

所以,当我m建造我的容器,我通常只是这样做:

builder.RegisterModule(AutoRegisterModule.ForCallingAssembly());