How to register all interface on assembly in Scrutor similar StructureMap

4.9k Views Asked by At

How to register all interface in assembly with scan extension without write all separated in ASP.NET Core 2?

in StructureMap:

Scan(_ =>
{
    // Declare which assemblies to scan
    _.Assembly("StructureMap.Testing"); 

});

in Scrutor:

collection.Scan(scan => scan
     // We start out with all types in the assembly of ITransientService
    .FromAssemblyOf<ITransientService>()
        // AddClasses starts out with all public, non-abstract types in this
        // assembly. These types are then filtered by the delegate passed to the
        // method. In this case, we filter out only the classes that are assignable
        // to ITransientService.
        .AddClasses(classes => classes.AssignableTo<ITransientService>())
            // We then specify what type we want to register these classes as.
            // In this case, we want to register the types as all of its implemented
            // interfaces. So if a type implements 3 interfaces; A, B, C, we'd end
            // up with three separate registrations.
            .AsImplementedInterfaces()
            // And lastly, we specify the lifetime of these registrations.
            .WithTransientLifetime()
        // Here we start again, with a new full set of classes from the assembly
        // above. This time, filtering out only the classes assignable to
        // IScopedService.
        .AddClasses(classes => classes.AssignableTo<IScopedService>())
            // Now, we just want to register these types as a single interface,
            // IScopedService.
            .As<IScopedService>()
            // And again, just specify the lifetime.
            .WithScopedLifetime());
2

There are 2 best solutions below

0
Igor Goyda On BEST ANSWER

This will register all classes which implemented some interfaces as StructureMap does by default:

services.Scan(scan => scan
    .FromAssemblyOf<IService>()
    .AddClasses()
    .AsImplementedInterfaces()
    .WithTransientLifetime());
0
Mohammad On

for all type of service life time you can define

services.Scan(scan => scan
      .FromAssemblyOf<IApplicationService>()

      .AddClasses(classes => classes.AssignableTo<IScopedDependency>())
      .AsMatchingInterface()
      .WithScopedLifetime()

      .AddClasses(classes => classes.AssignableTo<ISingletonDependency>())
      .AsMatchingInterface()
      .WithSingletonLifetime()

      .AddClasses(classes => classes.AssignableTo<ITransientDependency>())
      .AsMatchingInterface()
      .WithTransientLifetime()
);

where interfaces are

public interface IApplicationService { }
public interface IScopedDependency { }
public interface ITransientDependency { }
public interface ISingletonDependency { }

and for sample in a interface

public interface IUserService : IScopedDependency { }
public class UserService: IUserService { }