0

Angenommen, ich habe vier Projekte. DataRepositories, DataRepositoryInterfaces, SetupInject, WebAPI. Ich möchte, dass WebAPI nur einen direkten Bezug zu zwei dieser Projekte hat. Wesentlich machen WebAPI unwissend für die konkreten Implementierungen meiner Repository-Schnittstellen.Verwalten der Abhängigkeitsvererbung in .NET Core

Um dies zu tun, habe ich es so gemacht SetupInjektionen Hauptzweck ist es, die konkreten Typen zu definieren, die injiziert werden. Wenn ich jedoch auf das InjectionSetup-Projekt referenziere, bekomme ich alle Abhängigkeiten auch im WebAPI-Projekt.

Obwohl ich nie das Projekt verwiesen, die direkt auf die konkreten Klassen definiert, sind sie immer noch für mich zur Verfügung zu verwenden.Das Hauptziel besteht darin, den Entwickler daran zu hindern, eine Instanz der Klasse in diesem Projekt zu erstellen.

Although I never referenced the concrete classes directly, they are still available for me to use.

Ich erinnere mich, in der Lage, so etwas wie dies in früheren Versionen von .NET zu tun. Gibt es einen Weg, dies jetzt zu tun?

1) Was soll ich machen?

2) Kann es mit .Net Core gemacht werden?

3) Warum konnte es in früheren Versionen getan werden.

Antwort

1

Ich glaube, Sie können dies mit Friend Assemblies tun, https://msdn.microsoft.com/en-us/library/mt632254.aspx Ich habe oft in Unit-Test-Projekte, die auf Klassen zugreifen müssen als intern definiert verwenden.

In Ihrem SUT mit System.Runtime.CompilerServices; mit System;

[assembly: InternalsVisibleTo("AssemblyB")] 

// The class is internal by default. 
class FriendClass 
{ 
    public void Test() 
    { 
     Console.WriteLine("Sample Class"); 
    } 
} 

In Ihrer Einheit/Int testet

// Public class that has an internal method. 
public class ClassWithFriendMethod 
{ 
    internal void Test() 
    { 
     Console.WriteLine((new FriendClass).Test); 
    } 

} 

Hier weitere Details, https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx Sie auch zusätzliche Codesignatur es weiter einzuschränken hinzufügen.

+0

Das ist gut, aber ich möchte mehr implizit sein, anstatt jede Klasse zu deklarieren, die ich möchte, dass die ganze Versammlung versteckt wird. Danke für die Antwort, ich werde das verwenden, bis ich etwas passenderes finde, um es zu ersetzen –