如何在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 中使用依赖注入设计存储库模式?