如何在C#中使用具有存储库模式的依赖注入(AutoFac)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中使用具有存储库模式的依赖注入(AutoFac)相关的知识,希望对你有一定的参考价值。

大家

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

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

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

        base.Load(builder);
    }
}

但是我的问题如何告诉MVC项目我已经注册了我的组件,我是否需要调用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();
          }
}
另一答案

我在例子中使用了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));
    }
}
另一答案

您需要在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));
    }      
}

以上是关于如何在C#中使用具有存储库模式的依赖注入(AutoFac)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core MVC 中使用依赖注入设计存储库模式?

具有通用存储库和依赖注入和 SoC 的 EF6 Code First

如何为 .NET 库配置具有依赖注入的日志记录提供程序

如何使用 Hilt 在存储库中注入应用程序上下文?

具有内部两个服务和依赖注入的外观 - 设计模式方法

使用具有依赖注入的策略和工厂模式