GithubHelp home page GithubHelp logo

Comments (10)

gkarabin avatar gkarabin commented on July 21, 2024 2

My understanding from the original report is that the Essential.Interfaces package is supposed to provide instantiable wrappers for the static classes, as long as you are using its namespace rather than the static class namespace. I’m surprised that it doesn’t work if you’ve set it up properly.

That said, it looks like the project hasn’t been updated in years. I’m intrigued enough to want to follow up by building a test but probably won’t have a lot of time to look for a while.

from tinyioc.

niemyjski avatar niemyjski commented on July 21, 2024 1

@gaurakshay I did say that I know of... I don't know very much :). I'm just trying to help as I saw no one else responding... If you feel like we should support this, please feel free to open a pr and add unit test coverage. If you have a link to the docs for those respective library features I'd love to read more when I get time.

from tinyioc.

grumpydev avatar grumpydev commented on July 21, 2024 1

I'm not sure this makes any sense at all - as @niemyjski said, you have a static class there, and the static class can't implement that interface, so you can't use it as an implementation. The only way to work around this would be to build a non-static wrapper that implements that interface and delegates to the static class, which is something you'd have to do yourself then register that wrapper class in the container.

It's possible that some containers generate that wrapper for you automatically, but it would surprise me if that was the case as its a pretty strange thing to do, and unless your interface is huge its not much work to create the delegating implementation.

from tinyioc.

grumpydev avatar grumpydev commented on July 21, 2024 1

My understanding from the original report is that the Essential.Interfaces package is supposed to provide instantiable wrappers for the static classes, as long as you are using its namespace rather than the static class namespace. I’m surprised that it doesn’t work if you’ve set it up properly.

That said, it looks like the project hasn’t been updated in years. I’m intrigued enough to want to follow up by building a test but probably won’t have a lot of time to look for a while.

If that's the case then the OP is probably using the wrong class in the registration, it should be IFileSystem against the wrapper class, not the static one 🤷

from tinyioc.

gaurakshay avatar gaurakshay commented on July 21, 2024 1

@niemyjski , @grumpydev , @gkarabin I was being a dumbass. It was supposed to be

_container.Register<IFileSystem, FileSystemImplementation>();

instead of

_container.Register<IFileSystem, FileSystem>();

Please accept my apologies.

from tinyioc.

niemyjski avatar niemyjski commented on July 21, 2024

I'd recommend reading this: https://stackoverflow.com/questions/52325438/how-to-inject-dependency-to-static-class Also static classes can't implement interfaces. If you will have more than one implementation of file system, then I'd probably create a wrapper around the static type which is not ideal.. otherwise I'd consume FileSystem directly.

from tinyioc.

gaurakshay avatar gaurakshay commented on July 21, 2024

@niemyjski Thanks for the input!

Since I plan on using the DI in a regular class (not static) I don't think that the stackoverflow discussion applies in this case. I simply want to register the interface and implementation which then I will use like we usually do:

The interface that needs to be registered:

namespace Xamarin.Essentials.Intefaces
{
    public Interfaces IFileSystem
    {
        string CacheDirectory { get; }
        string AppDataDirectory { get; }
    }
}

The concrete type that I want to register against the interface:

namespace Xamarin.Essentials
{
    public static class FileSystem
    {
        public static string CacheDirectory { get; }
        public static string AppDataDirectory { get; }
    }
}

Register the two:

_container.Register<IFileSystem, FileSystem>();

Use DI to obtain the FileSystem object:

public class ClassA{
    public ClassA(IFileSystem fileSystem)
    {
        // initialize class fields
    }
}

It is alright if TinyIOC doesn't support this use case, I was looking for confirmation in case it is me just not familiar enough with this awesome package.

from tinyioc.

niemyjski avatar niemyjski commented on July 21, 2024

FileSystem doesn't even implement that interface and it's something no di will support (that I know of as there is no concept of shapes). I'm going to close this for the reasons above.

from tinyioc.

gaurakshay avatar gaurakshay commented on July 21, 2024

@niemyjski that is an unfair statement to make. I know both Autofac and MVVMCross's IOC implementation support this feature. I was merely trying to understand if this is something that TinyIOC offers as well or not. Based on your response I can guess it doesn't and that is fine. That is all I needed to know in the first place.

from tinyioc.

gaurakshay avatar gaurakshay commented on July 21, 2024

@niemyjski , @grumpydev I can look up and find more details about this if you both are interested.

from tinyioc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.