Skip to content

Commit

Permalink
Fix Autofac integration. Closes #238
Browse files Browse the repository at this point in the history
- Target netstandard2.0 to be compatible with both the framework and netcore
- Upgrade to Autofac 4.0.0+
- Eliminate the use of PropertiesAutowired in registration which breaks binary compatibility between versions
- Simplify rules/repository registration
  • Loading branch information
snikolayev committed Dec 1, 2020
1 parent 1add9de commit df15080
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 39 deletions.
6 changes: 3 additions & 3 deletions build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ $components = @{
tool = 'dotnet'
}
bin = @{
frameworks = @('net45')
'net45' = @{
frameworks = @('netstandard2.0')
'netstandard2.0' = @{
include = @(
"NRules.Integration.Autofac\bin\$configuration\net45"
"NRules.Integration.Autofac\bin\$configuration\netstandard2.0"
)
}
}
Expand Down
10 changes: 5 additions & 5 deletions packages/NRules.Integration.Autofac.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
<copyright>Copyright 2012-2020 Sergiy Nikolayev. All rights reserved.</copyright>
<tags>nrules autofac</tags>
<dependencies>
<group targetFramework="net45">
<group targetFramework="netstandard2.0">
<dependency id="NRules" version="[$version$]" />
<dependency id="Autofac" version="3.3.1" />
<dependency id="Autofac" version="4.0.0" />
</group>
</dependencies>
</metadata>
<files>
<file src="..\binaries\NRules.Integration.Autofac\net45\NRules.Integration.Autofac.dll" target="lib\net45" />
<file src="..\binaries\NRules.Integration.Autofac\net45\NRules.Integration.Autofac.xml" target="lib\net45" />
<file src="..\binaries\NRules.Integration.Autofac\net45\NRules.Integration.Autofac.pdb" target="lib\net45" />
<file src="..\binaries\NRules.Integration.Autofac\netstandard2.0\NRules.Integration.Autofac.dll" target="lib\netstandard2.0" />
<file src="..\binaries\NRules.Integration.Autofac\netstandard2.0\NRules.Integration.Autofac.xml" target="lib\netstandard2.0" />
<file src="..\binaries\NRules.Integration.Autofac\netstandard2.0\NRules.Integration.Autofac.pdb" target="lib\netstandard2.0" />
</files>
</package>
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30501.0
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRules.Integration.Autofac", "NRules.Integration.Autofac\NRules.Integration.Autofac.csproj", "{CDEA2301-F905-4B46-B791-2E049284D8DB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NRules.Integration.Autofac", "NRules.Integration.Autofac\NRules.Integration.Autofac.csproj", "{CDEA2301-F905-4B46-B791-2E049284D8DB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -19,4 +19,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61E3EE45-B1AC-46FE-8BF5-906F2595845E}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<Import Project="..\..\..\..\Common.props" />

<PropertyGroup>
<TargetFramework>net45</TargetFramework>
<TargetFramework>netstandard2.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\..\..\..\SigningKey.snk</AssemblyOriginatorKeyFile>
Expand All @@ -15,18 +15,18 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="3.3.1" />
<PackageReference Include="Autofac" Version="4.0.0" />
</ItemGroup>

<ItemGroup>
<Reference Include="NRules">
<HintPath>..\..\..\..\binaries\NRules\net45\NRules.dll</HintPath>
<HintPath>..\..\..\..\binaries\NRules\$(TargetFramework)\NRules.dll</HintPath>
</Reference>
<Reference Include="NRules.Fluent">
<HintPath>..\..\..\..\binaries\NRules\net45\NRules.Fluent.dll</HintPath>
<HintPath>..\..\..\..\binaries\NRules\$(TargetFramework)\NRules.Fluent.dll</HintPath>
</Reference>
<Reference Include="NRules.RuleModel">
<HintPath>..\..\..\..\binaries\NRules\net45\NRules.RuleModel.dll</HintPath>
<HintPath>..\..\..\..\binaries\NRules\$(TargetFramework)\NRules.RuleModel.dll</HintPath>
</Reference>
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,46 +10,40 @@ namespace NRules.Integration.Autofac
public static class RegistrationExtensions
{
/// <summary>
/// Registers fluent rule classes with the container.
/// Registers fluent rule types with the container, registers <see cref="RuleRepository"/> with the container
/// and loads registered rules into the repository.
/// By default repository is registered as a single instance and is wired with a <see cref="IRuleActivator"/>.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <param name="scanAction">Configuration action on the rule type scanner.</param>
/// <returns>Rule types registered with the container.</returns>
public static Type[] RegisterRules(this ContainerBuilder builder, Action<IRuleTypeScanner> scanAction)
/// <returns>Registration builder for <see cref="RuleRepository"/> to specify additional registration configuration.</returns>
public static IRegistrationBuilder<RuleRepository, ConcreteReflectionActivatorData, SingleRegistrationStyle>
RegisterRuleRepository(this ContainerBuilder builder, Action<IRuleTypeScanner> scanAction)
{
var scanner = new RuleTypeScanner();
scanAction(scanner);
var ruleTypes = scanner.GetRuleTypes();
builder.RegisterTypes(ruleTypes)
.AsSelf()
.InstancePerDependency();
return ruleTypes;
}

/// <summary>
/// Registers <see cref="RuleRepository"/> with the container.
/// By default repository is registered as a single instance and is autowired with a <see cref="IRuleActivator"/>.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <param name="initAction">Initialization action for the repository when it's created. This is the place to load rules.</param>
/// <returns>Registration builder for <see cref="RuleRepository"/> to specify additional registration configuration.</returns>
public static IRegistrationBuilder<RuleRepository, ConcreteReflectionActivatorData, SingleRegistrationStyle>
RegisterRepository(this ContainerBuilder builder, Action<RuleRepository> initAction)
{
builder.RegisterType<AutofacRuleActivator>()
.As<IRuleActivator>();

return builder.RegisterType<RuleRepository>()
.As<IRuleRepository>()
.PropertiesAutowired()
.SingleInstance()
.OnActivating(e => initAction(e.Instance));
.OnActivating(e =>
{
e.Instance.Activator = e.Context.Resolve<IRuleActivator>();
e.Instance.Load(s => s.From(x => x.Type(ruleTypes)));
});
}

/// <summary>
/// Registers <see cref="ISessionFactory"/> with the container.
/// Requires that <see cref="IRuleRepository"/> is registered with the container.
/// By default session factory is registered as a single instance and is autowired with a <see cref="IDependencyResolver"/>.
/// By default session factory is registered as a single instance and is wired with a <see cref="IDependencyResolver"/>.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <returns>Registration builder for <see cref="ISessionFactory"/> to specify additional registration configuration.</returns>
Expand All @@ -61,7 +55,7 @@ public static Type[] RegisterRules(this ContainerBuilder builder, Action<IRuleTy

/// <summary>
/// Registers <see cref="ISessionFactory"/> with the container.
/// By default session factory is registered as a single instance and is autowired with a <see cref="IDependencyResolver"/>.
/// By default session factory is registered as a single instance and is wired with a <see cref="IDependencyResolver"/>.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <param name="compileFunc">Compile function that creates an instance of <see cref="ISessionFactory"/>.</param>
Expand All @@ -75,12 +69,12 @@ public static Type[] RegisterRules(this ContainerBuilder builder, Action<IRuleTy
return builder.Register(compileFunc)
.As<ISessionFactory>()
.SingleInstance()
.PropertiesAutowired();
.OnActivating(e => e.Instance.DependencyResolver = e.Context.Resolve<IDependencyResolver>());
}

/// <summary>
/// Registers <see cref="ISession"/> with the container.
/// By default session is registered as an instance per lifetime scope and is autowired with a <see cref="IDependencyResolver"/>.
/// By default session is registered as an instance per lifetime scope.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <returns>Registration builder for <see cref="ISession"/> to specify additional registration configuration.</returns>
Expand All @@ -92,7 +86,7 @@ public static Type[] RegisterRules(this ContainerBuilder builder, Action<IRuleTy

/// <summary>
/// Registers <see cref="ISession"/> with the container.
/// By default session is registered as an instance per lifetime scope and is autowired with a <see cref="IDependencyResolver"/>.
/// By default session is registered as an instance per lifetime scope.
/// </summary>
/// <param name="builder">Container builder.</param>
/// <param name="factoryFunc">Factory function that creates an instance of <see cref="ISession"/>.</param>
Expand All @@ -102,7 +96,6 @@ public static Type[] RegisterRules(this ContainerBuilder builder, Action<IRuleTy
{
return builder.Register(factoryFunc)
.As<ISession>()
.PropertiesAutowired()
.InstancePerLifetimeScope();
}
}
Expand Down

0 comments on commit df15080

Please sign in to comment.