繁体   English   中英

如何在C#中将依赖注入(AutoFac)与存储库模式一起使用

[英]How to use Dependency Injection (AutoFac) with Repository Pattern in C#

大家

我正在使用存储库模式创建一个Project。 我在使用Autofac库实现依赖注入时遇到了麻烦,请帮助我如何在解决方案中实现它。

我创建了一个控制台库项目,在其中注册了所有组件,如下所示

public class ServiceModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<TestService>().As<ITestService>().InstancePerLifetimeScope();

        base.Load(builder);
    }
}

但是我的问题是如何告诉MVC Project我已经注册了组件,我是否需要在Global.asax文件中调用,或者还有其他最佳方法来做到这一点。 我没有找到任何可以帮助我实现它的解决方案。请帮助我实现它。

Github存储库链接-https: //github.com/Harshk16/WebApi

谢谢

您可以在Start_App文件夹下创建Bootstrapper.cs文件,然后粘贴以下代码。 只需为您的实现替换YOUR_REPOSITORY和YOUR_IREPOSITORY。

public static class Bootstrapper
    {
       public static void Run()
        {
            SetAutofacContainer();
        }


    private static void SetAutofacContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(Assembly.GetExecutingAssembly());

        // Repositories
        builder.RegisterType<YOUR_REPOSITORY>().As<YOUR_IREPOSITORY>().InstancePerRequest();

        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
 }

在global.asax中

protected void Application_Start()
        {
            // standard code
            //....

            // Autofac and Automapper configurations
             Bootstrapper.Run();
          }
}

您需要在MCV应用程序中如下设置容器。

有关详细信息,请参阅链接https://autofaccn.readthedocs.io/en/latest/integration/mvc.html#

public static class IocConfigurator
{
    public static void ConfigureDependencyInjection()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterType<Repository<Student>>().As<IRepository<Student>>();

        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }      
}

我在示例中使用了Dapper。

编辑:确保在项目中使用适当的AutoFac MVC集成DLL。

储存库配置

public interface IOrmRepository
{
    IDbConnection Connection { get; }
}

public class DapperRepository : IOrmRepository
{
    private readonly IDbConnection _context;

    public DapperRepository(IDbConnection context)
    {
        _context = context;
    }

    public IDbConnection Connection
    {
        get { return _context; }
    }
}

Global.asax中

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        this.RegisterDependencies();   // these are my dependencies
    }

    private void RegisterDependencies()
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);

        builder.Register(ctx =>
        {
            var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"];
            if (string.IsNullOrWhiteSpace(connectionString.ConnectionString))
                throw new InvalidOperationException("No ConnectionString");
            return new System.Data.SqlClient.SqlConnection(connectionString.ConnectionString);
        }).As<System.Data.IDbConnection>().InstancePerLifetimeScope();

        builder.RegisterType<DapperRepository>().As<IOrmRepository>().InstancePerLifetimeScope();

        //  Other dependencies is here

        builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
        builder.RegisterModelBinderProvider();
        builder.RegisterModule<AutofacWebTypesModule>();
        builder.RegisterSource(new ViewRegistrationSource());
        builder.RegisterFilterProvider();
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM