带类库的Autofac

时间:2015-11-19 11:44:31

标签: c# dependency-injection autofac

我有一个包含

的C#解决方案
-MVC project
-WCF Project
-Service library
-Model (Entity Framework)

MVC项目正在从Web服务获取所有数据。 WCF服务从服务库获取数据。

我现在正试图用Autofac实现DI。

到目前为止我所做的是在服务库中创建树类。

public class ServiceModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(Assembly.Load("Foot.Service"))
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
    }
}

public class EFModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType(typeof(FootContext)).As(typeof(IContext)).InstancePerLifetimeScope();
    }
}

public class Init
{
    public Init()
    {
        //Autofac Configuration
        var builder = new Autofac.ContainerBuilder();
        builder.RegisterModule(new ServiceModule());
        builder.RegisterModule(new EFModule());
        var container = builder.Build();

    }
}

这是正确的方法吗?然后调用WCF库中的Init()?

我应该为WCF服务做同样的事情吗?

此致

1 个答案:

答案 0 :(得分:1)

我可以在您的解决方案中看到两个应用程序。第一个应用程序是MVC项目。第二个应用程序是WCF服务。其他项目是类库而不是应用程序。

您需要做的是确保只有应用程序具有Composition Roots,即只有应用程序才能在其入口点组成对象。

引用文章引用:

  

只有应用程序应具有组合根。图书馆和框架不应该。

因此,您应该引用DI容器的唯一地方是两个提到的应用程序。因此,在您的情况下,这意味着您应该在WCF服务项目中注册服务和模型库中的类型。服务和模型库不应该对DI容器有任何引用。