Как использовать Dependency Injection (AutoFac) с шаблоном репозитория в C # - PullRequest
0 голосов
/ 02 октября 2018

Все

Я создаю проект с использованием шаблона хранилища.Я застрял при внедрении Dependency Injection с использованием библиотеки Autofac. Помогите, пожалуйста, реализовать его в Solution.

Я создал консольный проект библиотеки, в котором зарегистрировал все свои компоненты, как показано ниже

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.

Спасибо

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Я использовал Dapper в качестве примера.

Редактировать: Убедитесь, что в вашем проекте используется соответствующая DLL-библиотека интеграции AutoFac MVC.

Конфигурация репозитория

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));
    }
}
0 голосов
/ 02 октября 2018

Вы можете создать файл Bootstrapper.cs в папке Start_App и вставить следующий код.Просто замените 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();
          }
}
0 голосов
/ 02 октября 2018

Вам необходимо установить контейнер, как указано ниже в приложении 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));
    }      
}
...